.net - 从 x64 .NET 访问 x86 COM

标签 .net com interop x86 64-bit

我有一个 x64 服务器,因为我的库被编译为 AnyCPU,所以在 x64 下运行。我们需要访问在 x86 下注册的 COM 组件。我对 COM 知之甚少,我的谷歌搜索无处可去。

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

谢谢。

最佳答案

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

  • 如果可以的话,构建一个 64 位版本的 COM 代码(当然它会在 64 位注册表中注册自己)。这是最干净的解决方案,但如果您没有 COM 服务器的代码,则可能无法实现。
  • 将 .NET 组件作为 32 位 x86 而不是 x64 运行。我假设你已经考虑过并出于某种原因拒绝了这个。
  • 使用 COM surrogate 在进程外托管 COM 组件DLLhost.exe。这将使对 COM 服务器的调用变得非常非常慢(它们现在将处理 Windows 消息而不是 native 函数调用),但在其他方面是透明的(您不必做任何特殊的事情)。

    如果服务器需要自定义代理 stub 而不是使用普通的 oleaut32 代理 stub (尽管非常罕见),这可能不是一个选项,因为不会有 64 位版本的代理可用。只要能用普通的OLE编码,就可以register it for surrogate activation .
  • 关于.net - 从 x64 .NET 访问 x86 COM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/359331/

    相关文章:

    .net - 字母数字的正则表达式,但至少有一个字母

    .net - 鼠标移动灵敏度

    c++ - 传递 "IUnknown * &"作为参数时,COM 对象释放函数出错

    c++ - Windows ErrorMessage 返回代码而不是消息

    c# - 从 .NET 程序集透明地访问 native 内存

    c# - 父 View 内的部分 View 不向 Controller 发送数据 - asp.net MVC

    c# - 简洁轻量的API : REST+JSON in . NET

    HTML5 Websockets - 这会让我与主机通信吗?

    java - 将 LazySeq 从 Clojure 返回到 Java 时出现 ClassCastException

    c# - 将 C++ 字符串传递给 C# 函数