我有一个 x64 服务器,因为我的库被编译为 AnyCPU,所以在 x64 下运行。我们需要访问在 x86 下注册的 COM 组件。我对 COM 知之甚少,我的谷歌搜索让我无处可去。
问题:我可以为 COM 组件使用从 x64 回到 x86 的符号注册表链接吗?我是否也需要在 x64 下注册 COM 组件?我可以(这里有任何声明......)吗?
谢谢。
如果一个组件正在运行 x64-native,它不能在进程中加载 32 位 COM 服务器,因为它是错误的进程类型。有几种可能的解决方案:
如果可以的话,构建一个 64 位版本的 COM 代码(它当然会在 64 位注册表中注册自己)。这是最干净的解决方案,但如果您没有 COM 服务器的代码,则可能无法实现。
将 .NET 组件作为 32 位 x86 而不是 x64 运行。我假设你已经考虑过并出于某种原因拒绝了这个。
使用COM 代理DLLhost.exe 在进程外托管 COM 组件。这将使对 COM 服务器的调用慢得多(它们现在将是进程间 Windows 消息,而不是本机函数调用),但在其他方面是透明的(您不必做任何特别的事情)。
如果服务器需要自定义代理存根而不是使用普通的 oleaut32 代理存根(尽管非常罕见),这可能不是一个选项,因为不会有 64 位版本的代理可用。只要它可以使用普通的 OLE 编组,您就可以将其注册为代理激活。
我找到了这个解决方案,在 64 位 Windows 中处理旧版 32 位组件,请参阅文章:
• 将项目类型从进程内转换为进程外
• 使用 COM+ 作为主机(这对我有用)
•使用 dllhost 作为代理主机
它是您的 COM 组件位于 COM 服务器(即单独的进程)中,然后您不需要做任何特别的事情,因为 COM 子系统会将您的调用从 x64 应用程序远程调用到 X86 应用程序并再次返回。
如果您的组件是进程内 COM 组件,那么您将不得不重新考虑,因为 64 位进程不能在进程 COM 组件中使用 32 位。您可以强制您的服务器在 x86 下运行,以便您可以访问组件(它们都是 32 位进程)。如果您不想这样做,那么您必须查看您正在使用的 COM 组件是否有 x64 位版本。