【问题标题】:Can I link a 32-bit native dll (not .Net assembly) into my 64 bit .Net applicaiton?我可以将 32 位本机 dll(不是 .Net 程序集)链接到我的 64 位 .Net 应用程序吗?
【发布时间】:2013-09-14 11:39:26
【问题描述】:

我们有一个旧的第 3 方组件,它是一个 32 位本机 dll。在我们基于 COM 的应用程序中,我们通过 Windows API 链接它。现在,我们计划将我们的应用程序升级到 .Net 并在 64 位系统上运行。我的问题:我们还能通过 Windows API 将旧的 32 位原生 dll 链接到我们的 64 位 .net 应用程序吗?如果没有,关于如何让它工作的任何想法?

【问题讨论】:

  • 32 位本机代码在 64 位机器上运行良好。您必须将 EXE 项目的平台目标设置保持在 x86。
  • 32 位代码仅在安装了 WOW64 模拟器的情况下才能在 64 位机器上运行。从 Win2K8 R2 开始,WOW64 现在是可选组件,因此可能会安装也可能不会安装。
  • 没有头脑正常的人会忽略 WOW64
  • 他们的想法不正确非常准确地描述了数量庞大的客户。作为一个可选组件,您不能简单地忽略这种可能性。
  • 不需要运行 32 位应用程序的人除外。 WOW64 是可选的,这是有原因的。除非人们真正使用它,否则微软不会浪费时间制作仅 64 位的 SKU。

标签: .net winapi 32bit-64bit


【解决方案1】:

32 位代码不能在 64 位进程中使用,句号。但是,您可以将 32 位 DLL 包装在 32 位进程外 COM 服务器中(如果 DLL 已经是 COM 服务器,那么您可以使用 COM DllSurrogate 来代理它),然后是任何 64 -bit 进程(.NET 或其他)可以根据需要使用该 COM 服务器。否则,您必须将 .NET 项目设置为 32 位而不是 64 位。如果安装了 WOW64 模拟器组件,它仍然可以在 64 位机器上运行。

【讨论】:

  • 感谢雷米的输入。只是想澄清一下,当您说将其包装在 32 位进程外 COM 服务器中时,那仍然是 32 位 COM dll,对吗? 64 位 .net 应用程序能否链接到这个 32 位组件?通过 .Net 互操作?
  • 不,进程外 COM 服务器是 EXE,而不是 DLL。它在自己的进程中运行,并且 COM 编组根据需要对进程边界进行调用。这就是允许 64 位客户端进程访问 32 位进程外 COM 服务器的原因(对于 64 位服务器和 32 位客户端,反之亦然)。无论 COM 服务器是进程内还是进程外,.NET 客户端应用程序都将使用普通的 COM 互操作,因为这些细节被 COM 隐藏。
  • 我们的一个客户声称,他们的开发人员能够让他们的 .net 应用程序(编译为 x64)使用 Windows API 调用 32 位 Windows 本机 dll,就像他们使用 32 位应用程序一样(.net 应用程序编译为 x86)。他们问如果它对他们有用,为什么它对我们不起作用。这对我来说听起来根本不对,我在我的研究中没有发现任何支持这一点的东西。但在我告诉他们我不相信他们所说的之前,我仍然想确保我没有错过任何可能性。他们说的有可能吗?
  • 物理上不可能将32位DLL加载到64位进程中,直接在64位进程中执行32位代码。时期。我不知道他们在做什么,但这不是直接的。中间必须有一层。
  • 他们说他们正在做的是在“任何 CPU”选项下编译他们的 .net 应用程序。这就是他们让它发挥作用的方式。我只是尝试了同样的方法,令我惊讶的是,它似乎也有效!根据我找到的关于 Any CPU 的一些解释:“在 64 位机器上: •任何 CPU:作为 64 位进程运行,可以加载任何 CPU 和 x64 程序集,如果它尝试加载 x86 程序集,将得到 BadImageFormatException。 "看起来该应用程序仍然是 64 位应用程序(因为我们正在 64 位机器上进行测试)。不过,这件事对 64 位 .net 应用程序与 32 位本机 dll 一起工作有什么魔力?
【解决方案2】:

简短回答 无法链接,因为您不能将 32 位和 64 位链接在一起

沟通是的,但您需要两个可执行文件,一个 32 位,一个 64 位
那么之后就需要搜索进程间通信了。

如果您进行消息通信,您唯一可以在 32 位之间发送的 64 位是 WM_COPYDATA,它可能会被 UIPI 阻止,因此您可能需要使用 ChangeWindowMessageFilter 让它通过。

它可以工作,但你需要封装你想在 32 和 64 系统之间进行的每个调用。

【讨论】:

    猜你喜欢
    • 2014-07-09
    • 2020-02-12
    • 2012-01-23
    • 2019-06-12
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    相关资源
    最近更新 更多