从x64 .NET访问x86 COM
我有一个x64服务器,因为我的库被编译为AnyCPU,运行在x64下。 我们需要访问在x86下注册的COM组件。 我对COM的了解不够,我的谷歌search引导我无处可去。
问题:对于COM组件,我可以使用从x64到x86的符号registry链接吗? 我是否还需要在x64下注册COM组件? 我可以(在这里的任何声明…)?
谢谢。
如果某个组件运行的是x64-native,则无法加载进程中的32位COM服务器,因为这是一种错误的进程。 有几个解决scheme可能:
-
如果可以的话,build立一个64位版本的COM代码(这当然会在64位registry中注册)。 这是最干净的解决scheme,但如果您没有COM服务器的代码,则可能无法进行此操作。
-
运行您的.NET组件作为32位x86,而不是x64。 我想你已经考虑过,因为某种原因拒绝了这个。
-
使用COM代理 DLLhost.exe托pipeCOM组件的进程。 这会使调用COM服务器的速度慢得多(它们现在是进程间Windows消息而不是本地函数调用),但在其他方面是透明的(不必做任何特殊的事情)。
如果服务器需要一个自定义的代理存根,而不是使用正常的oleaut32,那么这可能不会成为一个选项(尽pipe非常less见),因为没有可用的代理的64位版本。 只要它可以使用普通的OLE编组,你可以注册它来代理激活 。
我find了这个解决scheme, 在64位Windows中处理传统32位组件请参阅文章:
•将项目types从进程中转换为进程外
•使用COM +作为主机(这项工作对我来说)
•使用dllhost作为代理主机
这是你的COM组件被安置在一个COM服务器(即一个单独的进程),那么你将不需要做任何特殊的事情,因为COM子系统将远程调用从X64应用程序到X86应用程序,然后再回来。
如果你的组件是一个进程内COM组件,那么你将不得不重新思考一个64位进程不能使用32位进程COM组件。 您可以强制您的服务器在x86下运行,以便您可以访问组件(它们都是32位进程)。 如果你不想这样做,那么你将不得不看看你使用的COM组件的x64位版本。