我可以在Windows上将32位DLL加载到64位进程中吗?

时间:2008-10-22 10:25:30

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

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

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

2 个答案:

答案 0 :(得分:25)

不,你不能。

  

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

     

...

     

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

     

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

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

答案 1 :(得分:6)

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

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

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

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

相关问题