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

.net 我可以在Windows上将32位DLL加载到64位进程中吗?,.net,windows,64-bit,x86-64,.net,Windows,64 Bit,X86 64,我最近升级了一个c#windows服务,使其作为64位.net进程运行。通常,这将是微不足道的,但是系统使用C++编写的32位DLL。它不是将此DLL转换为64位的选项,因此我将DLL包装在一个单独的32位.net进程中,并通过远程处理公开了一个.net接口 这是一个非常可靠的解决方案,但我更愿意将系统作为单个进程运行。有没有办法将我的32位DLL加载到64位进程中并直接访问它(可能通过某种thunking层)?不,你不能 16位和32位窗口都位于32位线性地址空间中。术语16和32表示相对于选

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

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

不,你不能

16位和32位窗口都位于32位线性地址空间中。术语16和32表示相对于选择器的偏移量大小

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

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


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

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

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


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

问题表明该进程是Windows服务,而不是ASP.NET网站。此外,您描述的IIS设置有效地实现了问题试图避免的相同解决方案。