.NET中的向后兼容COM引用

时间:2016-10-12 22:20:27

标签: c# com

作为一个简单的例子,我想使用CertEnroll来获取.NET证书。显示失败的单行代码:

CX509CertificateRequestPkcs10 certRequest = new CX509CertificateRequestPkcs10();

我的开发框是Windows 10,当我编译并运行代码时,它工作正常。然而,在Win10上进行编译并将二进制文件复制到较旧的版本中。操作系统(例如Windows Server 2008 R2)它会抛出InvalidCastException,表示不支持此类接口。

据我所知,这源于Windows 10的CertEnroll的com文件更新。查看Interop for CX509CertificateRequestPkcs10,它实现了IX509CertificateRequestPkcs10V5,但在Server上它只有IX509CertificateRequestPkcs10V5。因此,当在Windows 10上进行编译时,生成的interop期望运行时对象实现Windows Server COM实现不知道的接口。

从我的研究中我发现了以下可能的解决方案,但我不确定哪个是正确的"这样做的方法。

1)继续使用COMReference并仅构建我们支持的最低操作系统(开发人员无法接受)

2)从最低的操作系统中获取CertEnroll dll并使用COMFileReference引用它。 (这似乎是错误的,因为我们对这个二进制文件进行硬编码而不是在更新的操作系统上使用更新的CertEnroll)

3)从最低的操作系统中获取CertEnroll,使用它生成一个tlb文件并使用COMFileReference进行引用。我认为这样可行,因为tlb会更具限制性。由于它来自最低的操作系统,但是当Visual Studio生成实际的Interop二进制文件时,它仍然使用我的Windows 10 CertEnroll接口,使其与较低的操作系统不兼容。

4)从最低的操作系统获取CertEnroll,使用它来手动生成tlb文件和Interop文件。将Interop引用为COMFileReference。在这里,我不确定这是如何工作的,我是否需要在Server 2008上运行tlbimp以确保使用旧版本的COM引用生成Interop?

如果我完全遗漏了某些内容并且还有其他选择,请告知我们。

0 个答案:

没有答案