C# NET中向后兼容的COM引用

C# NET中向后兼容的COM引用,c#,com,C#,Com,作为一个简单的例子,我想使用CertEnroll在.NET中获取证书。显示故障的单行代码: CX509CertificateRequestPkcs10 certRequest = new CX509CertificateRequestPkcs10(); 我的开发工具是Windows10,当我在那里编译和运行代码时,它工作得很好。但是,在Win10上编译并将二进制文件复制到“较旧”的操作系统(例如Windows Server 2008 R2)会引发InvalidCastException,表示不

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

CX509CertificateRequestPkcs10 certRequest = new CX509CertificateRequestPkcs10();
我的开发工具是Windows10,当我在那里编译和运行代码时,它工作得很好。但是,在Win10上编译并将二进制文件复制到“较旧”的操作系统(例如Windows Server 2008 R2)会引发InvalidCastException,表示不支持此类接口

据我所知,这是因为Windows10的CertEnroll的com文件较新。查看CX509CertificateRequestKCS10的互操作,它实现了IX509CertificateRequestKCS10V5,但在服务器上只有IX509CertificateRequestKCS10V5。因此,在Windows 10上编译时,生成的互操作要求运行时对象实现Windows Server COM实现不知道的接口

从我的研究中,我发现了以下可能的解决方案,尽管我不确定哪种方法是“正确的”

1) 继续使用COMReference,只在我们支持的最低操作系统上构建(对于开发人员来说是不可接受的)

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

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

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


如果我完全遗漏了什么,并且还有其他选项,请告诉我。

当我在我的机器(Win10 1607)上使用OleView.exe反编译类型库时,它告诉我默认接口是IX509CertificateRequestSTPKCS10v4。很难猜测你是怎么得到V5的。顺便说一句,典型的敏捷bug是Win10的一个大问题。转换为IX509CertificateRequestPkcs10V3以保持向后兼容。