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

Meh*_*dad 8 .net winapi executable cross-platform portable-executable

令我感到困惑的是.NET中的"AnyCPU"功能如何工作:如果系统是32位,它将可执行文件加载为本机32位,如果系统是64位,则将其加载为64位(您可以轻松确认与任务管理器).显然,这并非不可能.

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

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


编辑:

作为一个侧面说明,考虑如何你不能在64位Windows PE环境中运行32位可执行文件...有以某种方式来与某种"插件"扩展或修改PE装载器,对不对?

Ben*_*igt 5

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

Windows最初不了解.NET框架

实际上,自Windows XP以来,Windows IS就知道.NET可执行格式.XP是第一个支持64位的Windows版本.

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

Windows XP及更高版本,知道.NET元数据后,会识别它AnyCPU并加载适当的框架.

这可能比你想知道的过程更多.

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