无注册在64位COM dll和C#/ .Net应用程序之间互操作

我试图在64位COM DLL和C#应用程序之间获得免注册COM互操作。

在我之前的一个问题的答案中 ,我得到了帮助,这使我能够在C#的64位COM dll上成功调用HelloWorld方法。

但是,这只能通过使用regsrv32.exe全局注册COM dll来实现。

基于对相关问题的这个答案 ,我认为我需要将COM dll的引用上的Isolated标志设置为true。 但是,这会导致以下构建错误:

Problem isolating COM reference 'ComLibInteropLib': No registered classes were detected for this component. 

关于MSDN社交问题的答案似乎表明,如果可以编译32位版本的dll,就可以解决这个问题。

但是,我的COM互操作库需要链接到一个“普通”的C ++ dll,我没有源代码,只能用于x64。

所以我的问题是:如何在64位COM dll和C#应用程序之间启用Isolated标志(或以其他方式并行工作)?

我很高兴在我的机器或其他开发人员的机器上使用regsrv32.exe,但我们无法在最终应用程序必须运行的生产机器上注册任何COM dll。

这是您遇到的原始问题的副作用,COM服务器未正确注册。 当您将Isolated选项设置为true时,构建系统会自动为您生成所需的清单条目。 但是清单的内容需要来自某个地方 ,它使用注册表项。 由于它们不存在,因此无法生成清单。

您可以自己编写清单,但需要对清单的外观有足够的了解。 由于犯错误率很高,咒语非常模糊。 因此,避免这种情况,您只需要注册COM服务器即可获得成功。 只是在你的构建机器上,它不必在客户端的机器上注册,因为它将使用清单。

您提到了64位COM服务器,这是另一种可能的故障模式。 构建系统仍然是32位,所以你会看到错误的键有很高的赔率。 HKLM \ Software \ Wow6432Node而不是HKLM \ Software。 通过构建COM服务器的两种风格来解决这个问题。 当你自己使用Regsvr32.exe时要小心遇到同样的问题,其中有两个。 应该使用c:\​​ windows \ syswow64中的一个来注册32位版本的服务器,对于64位版本,应该使用c:\​​ windows \ system32中的版本。