64位和32位Interop - 如何实现?

13

我需要将一些遗留的32位代码(没有源代码)集成到一个项目中,使得它可以从一个64位的.NET程序集中调用。原始代码是作为DLL中的32位COM对象实现的。Windows不允许从64位到32位对象进行直接调用,因此我在寻找如何处理这种情况的灵感。

如何从64位的.NET程序集中访问遗留的32位COM对象?

更新:我们发现该COM组件本身是一些ANSI C的包装器,我们找到了原始源代码。我们能够在Visual Studio中编译成本地的64位dll,并将其导入到.NET中 - 很抱歉改变了要求!


注释,因为我还没有做过,但是你需要确保将COM对象作为独立进程服务器运行。如果您将其加载为进程内,则会以64位运行,这将导致失败。 - Lasse V. Karlsen
3个回答

8
最佳方法是创建一个包装你的32位DLL的进程外COM服务器,然后从64位代码中调用它。
这里有一个基本概念的解释

我有些改变了目标,因为我们发现了一些源代码,让我们找到了一个不同的解决方案。我接受这个答案,因为我认为它最好地回答了原始问题并连接了有用的阅读材料。 - Tim Long

3

您需要做的是创建两个使用IPC通信的进程。这样,一个可以是32位,一个可以是64位。您需要创建一个32位程序,该程序链接到COM对象,并通过一些IPC机制(如命名管道)公开其API。这样,您的.NET程序就可以从另一个进程中访问它了。


这种方法是可行的,但如果您已经在使用COM,为什么不使用COM互操作而改用命名管道呢? - Reed Copsey
@Reed Copsey:是的,当然你可以用它来处理COM。但我的方法更通用,也适用于普通的库。 - Zifre
我想使用WCF来使用命名管道进行进程间通信。唯一的问题是,管道的两端都需要看到相同的接口定义,并且必须在32位程序集中。当您尝试运行它时,整个事情会崩溃。 - Tim Long

3
请查看此博客文章。使用可运行包装器可以从64位.NET应用程序引用32位COM组件。简单的做法如下:
  1. 使用tlbimp.exe创建64位运行时可调用包装器:

    tlbimp.exe foo.dll /machine:x64 /out:Interop.Foo.dll

  2. 如果还没有注册COM组件(而非RCW),请先注册:

    regsvr32.exe foo.dll

  3. 从应用程序引用RCW(例如Interop.Foo.dll)。将构建配置更改为x64并运行即可。


这不是原问题的解决方案。 - Pedro Lamarão

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接