2008-12-11 79 views
22

我有一个x64服务器,自从我的库被编译为AnyCPU后,它将在x64下运行。我们需要访问在x86下注册的COM组件。我对COM的了解不够,我的谷歌搜索引导我无处可去。从x64 .NET访问x86 COM1

问题:对于COM组件,我可以使用从x64到x86的符号注册表链接吗?我是否还需要在x64下注册COM组件?我可以(在这里的任何声明...)?

谢谢。

回答

26

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

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

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

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

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

+0

#1是不可能的,因为没有x64版本。 #2失败了在x64上运行的目的。 #3工作得很好。直到我们获得新版本的图书馆,我们才能在这里接受表演。谢谢你的帮助。 – 2008-12-11 14:29:56

2

这是你的COM组件被装在一个COM服务器(即一个独立的过程),那么你不需要做任何特殊的COM子系统将遥控你的电话从你的x64应用的X86应用程序和再次回来。

如果您的组件是一个进程内COM组件,那么您将不得不重新考虑一下,因为64位进程无法在进程COM组件中使用32位。您可以强制您的服务器在x86下运行,以便您可以访问这些组件(它们都将是32位进程)。如果你不想这样做,那么你将不得不看看你使用的COM组件的x64位版本。

6

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

+7

镜像链接:http://www.scribd.com/doc/56629579/64-Bit-Insider-Volume-1-Issue-7 – Juhl 2011-11-03 13:58:37