代码之家  ›  专栏  ›  技术社区  ›  Craig Wilson

从x64.net访问x86 COM

  •  23
  • Craig Wilson  · 技术社区  · 16 年前

    我有一个X64服务器,因为我的库被编译为anycpu,所以它在X64下运行。我们需要访问在x86下注册的COM组件。我对COM的了解不够,而且我的谷歌搜索也没有给我带来什么。

    问题:对于COM组件,我可以使用从x64返回到x86的符号注册表链接吗?我还需要在x64下注册COM组件吗?我可以(这里有什么声明…)吗?

    谢谢。

    3 回复  |  直到 10 年前
        1
  •  27
  •   puetzk    16 年前

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

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

    2. 以32位x86而不是x64运行.NET组件。我想你已经考虑过,出于某种原因拒绝了这个。

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

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

        2
  •  6
  •   lsalamon    10 年前

    我找到了这个解决方案, Dealing with Legacy 32-bit Components in 64-bit Windows 请参见文章:
    将项目类型从正在进行的转换为正在进行的转换
    _窆使用COM+作为主机(这对我有效)
    _穖使用dllhost作为代理主机

        3
  •  2
  •   Sean    14 年前

    它是你的COM组件被安置在一个COM服务器(即一个单独的进程)中,然后你就不需要做任何特殊的事情,因为COM子系统会把你从x64应用程序到x86应用程序的调用远程化,然后再返回。

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

    推荐文章