.NET 中的“AnyCPU”功能如何工作一直让我困惑:如果系统是 32 位,它会将可执行文件加载为本机 32 位,如果系统是 64 位,则加载为 64 位(您可以轻松确认)与任务管理器)。显然,这并非不可能。
问题是,微软到底是如何做到这一点的呢? Windows 最初并不了解 .NET 框架,因此 Windows PE 加载程序不可能在 PE 标头中为 CLR 标头查找任何额外功能;此功能必须是通过某种内核模式扩展添加的。但 .NET 框架似乎没有安装这样的东西...我完全不知道同一个可执行文件如何同时是本机 32 位和 64 位,特别是因为 mscoree.dll 的反汇编并没有甚至不显示对未记录的本机函数的引用。
有谁对这是如何完成的有任何了解和/或合理的猜测吗?这显然是可能的(所以不要说“这是不可能的”之类的话),这让我想尝试写一个native跨平台EXE...
Edit:
作为旁注,请考虑如何无法在 64 位 Windows PE 环境中运行 32 位可执行文件...got是用某种“插件”来扩展或修改 PE 加载程序的方式,对吗?
你的问题是基于误解。这是错误:
Windows最初并不知道.NET框架
事实上,从Windows XP开始,Windows 识别 .NET 可执行格式。 XP 是第一个支持 64 位的 Windows 版本。
因此PE头被标记为32位并且本机导入表引用32位mscoree
,在 Windows 2000 及更早版本上,会导致加载 32 位 .NET。DllMain
for mscoree
启动对应用程序代码进行 JIT 处理并修改主应用程序的入口点。
Windows XP 及更高版本了解 .NET 元数据,认识到它是AnyCPU
并加载适当的框架。
关于这个过程,这可能比你想知道的还要多.
所以不,没有本地人AnyCPU
EXE文件。虽然您可以在 32 位 PE 中嵌入 16 位 DOS 程序,但您不能同时拥有 32 位和 64 位 .exe
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)