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

时间:2014-01-24 14:45:25

标签: c# visual-studio-2012 com 64-bit com-interop

我正在尝试在64位COM dll和C#应用程序之间进行无注册的COM互操作。

In the answers to a previous question of mine,我得到了帮助,允许我在C#的64位COM dll上成功调用HelloWorld方法。

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

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

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

The answer to a question on MSDN social似乎表明,如果可以编译32位版本的dll,就可以解决此问题。

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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