可以在Windows上将32位DLL加载到64位进程中吗?
我最近升级了一个c#windows服务以运行64位.net进程。通常情况下,这将是微不足道的,但系统使用C++编写的32位DLL。它不是一个将此DLL转换为64位的选项,因此我将DLL封装在单独的32位.net进程中,并通过远程处理暴露了.net接口。可以在Windows上将32位DLL加载到64位进程中吗?
这是一个相当可靠的解决方案,但我宁愿将系统作为单个进程运行。有什么办法可以将我的32位DLL加载到64位进程中并直接访问它(也许通过某种thunking层)?
不,你不能。
16位和32位Windows均位于32位线性地址空间中。术语16和32指的是相对于选择器的偏移大小。
...
首先,注意一个全尺寸的16位指针和一个32位平面指针具有相同的尺寸。值0x0123:0x467需要32位,而哇,32位指针也是如此。这意味着包含指针的数据结构在16位和32位对应数据之间不会改变大小。非常方便的巧合。
这两个观察结果都不适用于32位到64位thunk。指针的大小发生了变化,这意味着将32位结构转换为64位结构或反过来会改变结构的大小。 64位地址空间比32位地址空间大40亿倍。如果在偏移量为0x000006fb`的64位地址空间中存在某些内存,则32位代码将无法访问它。这不像你可以建立一个临时地址窗口,因为32位平面代码不知道这些临时地址窗口;他们放弃了选择器,记得吗?
http://blogs.msdn.com/oldnewthing/archive/2008/10/20/9006720.aspx
如果你的.NET应用程序是在IIS中运行一个网站,你可以绕过它。
在64位机器上的IIS上运行的ASP.NET网页将由64位版本的w3wp.exe进程托管,如果您的网页使用32位dll,则您的网站将失败。
但是,在IIS中,您可以进入运行该站点的应用程序池的高级设置,并将“启用32位应用程序”更改为true。
因此,它仍然无法在64位进程中运行32位dll,而是将它作为32位进程运行w3wp.exe。
该问题指出该进程是Windows服务而不是ASP.NET网站。更重要的是,您所描述的IIS设置实际上实现了与问题试图避免的相同的解决方案。 – 2011-12-14 14:30:53