从x64 .NET访问x86 COM

时间:2008-12-11 13:25:43

标签: .net com interop x86 64-bit

我有一个x64服务器,由于我的库被编译为AnyCPU,因此在x64下运行。我们需要访问在x86下注册的COM组件。我不太了解COM,我的谷歌搜索让我无处可去。

问题:我可以使用从x64到x86的符号注册表链接来获取COM组件吗?我是否还需要在x64下注册COM组件?我可以(这里有任何陈述......)吗?

感谢。

3 个答案:

答案 0 :(得分:29)

如果组件正在运行x64-native,则它无法在进程中加载​​32位COM服务器,因为它是错误的进程。有几种解决方案可能:

  1. 如果可以的话,构建一个64位版本的COM代码(当然可以在64位注册表中注册)。这是最干净的解决方案,但如果您没有COM服务器的代码,则可能无法实现。

  2. 将.NET组件作为32位x86而不是x64运行。我假设你已经考虑过并且因为某种原因拒绝了这个。

  3. 使用COM surrogate DLLhost.exe在进程外托管COM组件。这将使调用COM服务器的速度变慢得多(它们现在将是进程间的Windows消息而不是本机函数调用),但在其他方面是透明的(您不必做任何特殊的事情)。

    如果服务器需要自定义代理存根而不是使用普通的oleaut32(非常罕见),这可能不是一个选项,因为不会有64位版本的代理可用。只要它可以使用普通的OLE编组,你就可以register it for surrogate activation

答案 1 :(得分:7)

我找到了这个解决方案,Dealing with Legacy 32-bit Components in 64-bit Windows参见文章:
•将项目类型从进程内转换为进程外的
•使用COM +作为主持人(这项工作对我来说)
•使用dllhost作为代理主机

答案 2 :(得分:2)

这是你的COM组件放在一个COM服务器(即一个单独的进程),然后你不需要做任何特别的事情,因为COM子系统将远程调用你的x64应用程序到X86应用程序再返回。 / p>

如果您的组件是进程内COM组件,那么您将不得不重新考虑事情,因为64位进程不能在进程COM组件中使用32位。您可以强制您的服务器在x86下运行,以便您可以访问组件(它们都是32位进程)。如果您不想这样做,那么您将需要查看是否有您正在使用的COM组件的x64位版本。