我最近升级了ac#windows服务作为64位.net进程运行。 通常情况下,这将是微不足道的,但系统使用C ++编写的32位DLL。 这不是一个select将此DLL转换为64位,所以我将DLL包装在一个单独的32位.net进程,并通过远程处理暴露.net接口。
这是一个相当可靠的解决scheme,但是我宁愿将系统作为单个进程运行。 有什么办法可以加载我的32位DLL到64位进程,并直接访问它(也许通过某种thunking层)?
如何保护一个窗口.net应用程序中的静态string?
有没有办法部署.Net应用程序而不使用MSI?
如何开发Windows应用程序
Autocad不同的API的混乱
如何测量文件(硬盘)I / O的特性?
不,你不能。
16位和32位Windows都位于32位线性地址空间中。 术语16和32指的是相对于选择器的偏移的大小。
…
首先,注意一个全尺寸的16位指针和一个32位平面指针是相同的大小。 值0x0123:0x467需要32位,而哇,32位指针也是如此。 这意味着包含指针的数据结构不会在16位和32位对应的数据结构之间改变大小。 非常方便的巧合。
这两个观察都不适用于32位到64位的thunk。 指针的大小发生了变化,这意味着将32位结构转换为64位结构,反之亦然,结构的大小会发生变化 。 64位地址空间比32位地址空间大40亿倍。 如果在偏移0x000006fb`01234567的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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。