XpsDocument.SignDigitally 在 IsSignable 上抛出 NullReferenceException

问题描述

我遇到了标题中提到的方法的问题。如果我尝试签署 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,它将为空。