加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

为Windows编写跨平台(32位和64位兼容)程序(如.NET中的AnyCPU)

发布时间:2020-12-14 04:07:02 所属栏目:Windows 来源:网络整理
导读:令我感到困惑的是.NET中的“AnyCPU”功能如何工作:如果系统是32位,它将可执行文件加载为本机32位,如果系统是64位,则将其加载为64位(您可以轻松确认与任务管理器).显然,这并非不可能. 问题是,微软究竟是如何做到这一点的? Windows最初不了解.NET框架,因此Wi
令我感到困惑的是.NET中的“AnyCPU”功能如何工作:如果系统是32位,它将可执行文件加载为本机32位,如果系统是64位,则将其加载为64位(您可以轻松确认与任务管理器).显然,这并非不可能.

问题是,微软究竟是如何做到这一点的? Windows最初不了解.NET框架,因此Windows PE Loader无法在PE头中查找CLR头的任何额外功能;必须通过某种内核模式扩展添加此功能.但.NET框架似乎没有安装这样的东西……我完全失去了同一个可执行文件同时可以是原生的32位和64位,特别是因为mscoree.dll的反汇编没有甚至显示对未记录的本机函数的引用.

有没有人对如何做到这一点有任何知识和/或合理的猜测?这显然是可能的(所以不要说“它不可能”),这让我想尝试编写一个原生的跨平台EXE ……

编辑:

作为旁注,请考虑如何在64位Windows PE环境中运行32位可执行文件…必须有某种方法来扩展或修改带有某种“插件”的PE加载程序,对吧?

你的问题是基于误解.这是错误:

Windows originally didn’t know about the .NET framework

实际上,自Windows XP,Windows IS aware of the .NET executable format以来,XP是第一个支持64位的Windows版本.

因此,PE标头标记为32位,本机导入表引用32位mscoree,在Windows 2000及更早版本中,会导致加载32位.NET.用于mscoree的DllMain启动JITting应用程序代码并修改主应用程序的入口点.

知道.NET元数据的Windows XP及更高版本认识到它是AnyCPU并加载适当的框架.

Here’s probably more than you ever wanted to know about the process.

所以不,没有原生的AnyCPU exe.虽然您可以在32位PE中嵌入16位DOS程序,但您不能将32位和64位组合使用.exe

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读