我有一个asp.net 4.0项目,它使用Bouncy城堡和.Net框架的组合来创建X509证书。
它在我的W7开发计算机上正常运行,但是当安装在W2008 (32位,而不是r2)上时,这段代码如下:
CX509CertificateRequestPkcs10 csr = new CX509CertificateRequestPkcs10();抛出此异常:
无法将类型为“System.__ComObject”的COM对象转换为接口类型'CERTENROLLLib.CX509CertificateRequestPkcs10'.此操作失败,因为对IID‘{728AB35B-217D-11DA-B2A4-000E7BB2B09}’接口的COM组件的QueryInterface调用失败:不支持此类接口( HRESULT: 0x80004002 (E_NOINTERFACE)例外)。
最初,我认为这可能是64位服务器问题,因为COM只兼容32位,但服务器是32位。
该应用程序是使用Framework4.0构建的,指定的IIS AppPool正在运行4.0集成模式,其标识为“网络服务”--与客户端浏览器使用的完全相同(IE8 32)。
W2008-32 (标准)不直接实现CERTENROLLLib吗?有人知道在这种情况下该怎么做吗?
谢谢你的建议!
发布于 2012-07-10 21:30:06
实例化CX509CertificateRequestPkcs10对象时,请显式指定要使用的接口(通过ProgID)。在Win2008 R2中,微软重写了界面。而不是:
CX509CertificateRequestPkcs10 objPkcs10 = new CX509CertificateRequestPkcs10();用途:
IX509CertificateRequestPkcs10 objPkcs10 = (IX509CertificateRequestPkcs10)Activator.CreateInstance(Type.GetTypeFromProgID("X509Enrollment.CX509CertificateRequestPkcs10"));由于在Win2008 R2微软中重写了接口,如果代码是用Win2008 R2编写的,运行时将寻找新的接口Guid,而在常规Win2008中,由于Win2008 R2接口GUID与Win2008接口GUID不同,无法找到它。
因此,无法创建对象,因此会抛出异常。
通过ProgID访问接口解决了这一问题。
参见:TechNet答案 -在W2008-32上,在创建Pkcs10对象时必须指定接口GUID,因为R2覆盖了旧的“标准”接口。
https://stackoverflow.com/questions/11421502
复制相似问题