【发布时间】:2021-10-15 23:20:45
【问题描述】:
我在编译 .NET 程序时对“AnyCPU”的理解是编译后的 EXE/DLL 应该在 x86 和 x64(以及其他?)CPU 上运行。
我想生成的中间语言被 Just-In-Time 编译器翻译成相关的机器代码,并且 .NET 运行时知道目标 CPU,所以这是有道理的。
我不明白 EXE(以及 JIT 编译器/CLR)实际上是如何启动的;程序的入口点肯定需要存在一些机器代码吗?那么在编译之前不需要知道目标 CPU 架构吗?
[编辑:删除了反汇编代码,因为我查看了错误的地址]
当我最初发布这个问题时,我没有意识到 x86 和 x64 机器代码有多相似,所以我的猜测是生成入口点的代码可以在 x86 和 x64 上工作。
【问题讨论】:
-
它比看起来要复杂得多,从 32 位 .exe 文件创建 64 位进程需要 significant tricks。这不再那么重要了,当您使用 VS 构建时,.NETCore 需要一个明确的主机,即 dotnet.exe 或 apphost.exe(重命名为项目名称)。主机的选择锁定了位数。
-
我不太明白你在说什么。首先,我真正感兴趣的案例(这是我在编译时看到的)是一个明显的 64 位 EXE 如何在 32 位机器上运行。其次,如果我双击我的 EXE,无论我是否安装了任何 .NET 框架,它肯定会作为本机 EXE 运行。当然,它稍后会失败,但它会运行得足够远,告诉我我需要这个框架,对吧?
标签: .net windows portable-executable