问题描述
我遇到了标题中提到的方法的问题。如果我尝试签署 XPS 文档,它会遇到 NullReferenceException:
在 System.Windows.Xps.Packaging.XpsDocument.get_IsSignable() 在 System.Windows.Xps.Packaging.XpsDocument.SignDigitally(X509Certificate 证书、布尔 embedCertificate、XpsDigSigPartAlteringRestrictions 限制、String signatureId、Boolean testIsSignable) 在 System.Windows.Xps.Packaging.XpsDocument.SignDigitally(X509Certificate 证书、Boolean embedCertificate、XpsDigSigPartAlteringRestrictions 限制)
任何建议将不胜感激。
if (sign_digitally)
{
UserCertificateSelector selector = new UserCertificateSelector();
if (selector.ShowDialog() == true)
{
var certStore = new X509Store(StoreName.My,StoreLocation.CurrentUser);
certStore.Open(OpenFlags.ReadOnly);
#if DEBUG
X509CertificateCollection collection = certStore.Certificates;
#else
X509CertificateCollection collection = certStore.Certificates.Find(X509FindType.FindByThumbprint,selector.SelectedCertificate.CertificateThumbPrint,true);
#endif
if (collection.Count > 0)
{
xpsDoc.SignDigitally(collection[0],true,XpsDigSigPartAlteringRestrictions.None);
}
}
}
...
解决方法
确保您处理的是 XPS 文件格式,而不是 OXPS。两者都可以作为 XpsDocument 打开,但只能对 XPS 进行签名。打开文件后,您可以检查“XpsDocument.IsSignable”标志 - 对于 OXPS,它将为空。