【问题标题】:Best way to call 32-bit unmanaged code from 64-bit Managed Code using a managed code wrapper使用托管代码包装器从 64 位托管代码调用 32 位非托管代码的最佳方式
【发布时间】:2011-02-28 16:43:49
【问题描述】:

随着 64 位机器和应用程序的普及,我必须从托管的 64 位进程调用本机 32 位代码的频率正在增加。我不想将我的应用程序标记为 32 位,并且我无法获得正在调用的代码的 64 位版本。

我目前使用的解决方案是创建 C++ COM 填充程序,从进程中加载​​以从 64 位进程进行 32 位调用。

这种 COM shim 解决方案运行良好,跨进程调用由 COM 在幕后处理,从而最大限度地减少了这种方法的开销。

然而,我想保留我们使用 C# 进行的所有新开发,并想知道是否有任何框架可以最大限度地减少这样做的开销。我看过 IPCChannel,但我觉得这种方法不如 COM shim 解决方案那么简洁。

谢谢, 埃德

【问题讨论】:

  • 就其价值而言,COM 解决方案听起来像是 IMO 的必经之路。

标签: c# .net 32bit-64bit managed


【解决方案1】:

几乎唯一的答案是进程外通信。您可以创建一个 .NET 项目,它是一个 32 位可执行文件,它可以进行所需的所有 32 位调用,并通过 Windows 消息、WCF、命名管道、内存映射文件 (4.0) 等与其通信。我很确定这就是 Paint.NET 从 64 位进程执行 WIA(Windows 图像采集)的方式。

在 PDN 的情况下,他们只是将他们期望的文件名作为输出传递,但更复杂的通信并不困难。这可能是更好的方法,具体取决于您正在做什么。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,我的解决方案是使用remoting。基本上该项目包括:

    • 独立于平台的CalculatorRemote.dll 库与
      • CalculatorNative 带有 x32 P/Invoke 方法的内部静态类
      • RemoteCalculator 派生自 MarshalByRefObject 的类,它使用来自 CalculatorNative 的本机方法;
    • 独立于平台的主要 C# 库(例如 Calculator.dll),引用 CalculatorRemote.dll,其中 Calculator 类私下使用 RemoteCalculator 类的单例在需要时调用 x32 函数;
    • x32 控制台应用程序,它从 CalculatorRemote.dll 托管 RemoteCalculator 以供 Calculator.dll 通过 IpcChannel 使用。

    因此,如果主应用程序以 x64 模式启动,它会生成一个 RemoteCalculator 主机应用程序并使用远程 RemoteCalculator 实例。 (在 x32 中它只使用 RemoteCalculator 的本地实例。)棘手的部分是告诉计算器主机应用程序关闭。

    我认为这比使用 COM 更好,因为:

    • 您不必在任何地方注册 COM 类;
    • 与 COM 的互操作应该比 .NET 远程处理慢;
    • 有时,如果 COM 端出现问题,您需要重新启动应用程序才能从中恢复; (可能我对 COM 不太熟悉)
    • 在 x32 模式下运行时,远程处理不会有任何性能损失 - 所有方法都将在同一个 AppDomain 中调用。

    【讨论】:

      猜你喜欢
      • 2017-04-01
      • 2012-01-14
      • 2013-08-24
      • 2010-09-18
      • 1970-01-01
      • 2010-12-25
      • 2011-01-29
      • 2013-12-29
      • 1970-01-01
      相关资源
      最近更新 更多