【问题标题】:Can I load a 32 bit DLL into a 64 bit process on Windows?我可以在 Windows 上将 32 位 DLL 加载到 64 位进程中吗?
【发布时间】:2010-09-18 12:24:38
【问题描述】:

我最近升级了一个 c# windows 服务以作为 64 位 .net 进程运行。通常,这很简单,但系统使用了一个用 C++ 编写的 32 位 DLL。将此 DLL 转换为 64 位不是一个选项,因此我将 DLL 包装在一个单独的 32 位 .net 进程中,并通过远程处理公开了一个 .net 接口。

这是一个相当可靠的解决方案,但我更愿意将系统作为单个进程运行。有什么方法可以将我的 32 位 DLL 加载到 64 位进程中并直接访问它(可能通过某种 thunking 层)?

【问题讨论】:

    标签: .net windows 64-bit x86-64


    【解决方案1】:

    不,你不能。

    16 位和 32 位 Windows 都存在于 32 位线性地址空间中。术语 16 和 32 指的是偏移量相对于选择器的大小。

    ...

    首先,请注意全尺寸的 16 位指针和 32 位平面指针的大小相同。值 0x0123:0x467 需要 32 位,哇,32 位指针也是如此。这意味着包含指针的数据结构不会在 16 位和 32 位对应物之间改变大小。一个非常方便的巧合。

    这两个观察结果都不适用于 32 位到 64 位的转换。指针的大小发生了变化,这意味着将 32 位结构转换为 64 位结构,反之亦然会改变结构的大小。并且 64 位地址空间是 32 位地址空间的 40 亿倍。如果 64 位地址空间中偏移量 0x000006fb`01234567 处有一些内存,则 32 位代码将无法访问它。并不是说你可以建立一个临时地址窗口,因为 32 位平面代码不知道这些临时地址窗口;他们放弃了选择器,记得吗?

    http://blogs.msdn.com/oldnewthing/archive/2008/10/20/9006720.aspx

    【讨论】:

      【解决方案2】:

      如果您的 .NET 应用程序是在 IIS 中运行的网站,您可以绕过它。

      在 64 位计算机上的 IIS 上运行的 ASP.NET 网页将由 64 位版本的 w3wp.exe 进程托管,如果您的网页使用 32 位 dll,您的网站将会失败。

      但是在 IIS 中,您可以进入运行该站点的应用程序池的高级设置,并将“启用 32 位应用程序”更改为 true。

      所以它仍然无法在 64 位进程中运行 32 位 dll,而是将 w3wp.exe 作为 32 位进程运行。

      【讨论】:

      • 问题指出该进程是 Windows 服务而不是 ASP.NET 网站。此外,您描述的 IIS 设置有效地实现了问题试图避免的相同解决方案。
      猜你喜欢
      • 2013-02-06
      • 2012-02-05
      • 2011-09-11
      • 2018-05-29
      • 2014-08-10
      • 2011-08-12
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      相关资源
      最近更新 更多