Compilation x86/x64中编译与MSIL的关系

Compilation x86/x64中编译与MSIL的关系,compilation,x86,64-bit,jit,cil,Compilation,X86,64 Bit,Jit,Cil,所以我知道如果你为任何CPU编译,你会得到一个MSIL输出。如果编译为x86,则会得到x86输出 我对这个过程的理解如下 .NET Code -> Compiler -> MSIL -> JIT compiled in CLR -> Native Instruction 我的问题是,如果在x86/x64中编译,是否会跳过上面在CLR中编译的MSIL->JIT步骤?还是我的理解错了?你的理解不太正确。如果程序集仅由托管代码组成,则无论编译器设置如何(AnyCPU/x86/

所以我知道如果你为任何CPU编译,你会得到一个MSIL输出。如果编译为x86,则会得到x86输出

我对这个过程的理解如下

.NET Code -> Compiler -> MSIL -> JIT compiled in CLR -> Native Instruction

我的问题是,如果在x86/x64中编译,是否会跳过上面在CLR中编译的
MSIL->JIT步骤?还是我的理解错了?

你的理解不太正确。如果程序集仅由托管代码组成,则无论编译器设置如何(AnyCPU/x86/x64),它都将被编译为纯MSIL,因此即使编译为x86,也会得到MSIL


如果编译为AnyCPU,则程序集可以作为32位或64位进程运行或加载,而如果编译为x86,则只能作为32位进程运行(或加载)。类似地,当编译为x64时,它只能作为(或加载到)64位进程运行。两种情况下都使用相同的MSIL,JIT将MSIL编译为所需的32/64位本机代码。

对于托管程序集,CPU风格仅限制使用的解释器。现在有四种风格:anyCPU(在任何地方运行,使用操作系统位)、anyCPU-32bit首选(在32位的任何地方运行,使用32位)、x64(需要64位x86操作系统)、x86(需要32位x86操作系统)。除非您处理非托管DLL,否则此选项没有什么用处。它是否真的是“相同”的MSIL,或者您的意思是它仍然是MSIL?我不使用.NET或Windows,但我假设仅针对x86或x64将在MSIL中进行优化,这些优化仅对32位指针有效,或仅对64位指针有效,或诸如此类。因此,如果提前编译器已经开始专门化,那么JIT编译器所要做的工作可能会更少?@PeterCordes一个快速测试表明,将项目编译为AnyCPU/x86/x64时,输出之间的唯一区别是几个指示编译类型的头-实际生成的MSIL是相同的,将所有特定于平台的优化留给JIT来完成。很有趣,谢谢您的检查。那么,我想知道重点是什么。啊,这表明非托管代码可能会执行依赖于比特数的操作。在前面的一个问题中,当我使用dotPeek查看任何CPU编译生成的exe时,dotPeek有一个MSIL标签。当x86编译时,标签会显示为x86。我想我的困惑是因为那个MSIL标签。也许JetBrains的MSIL只是意味着它可以加载到32/64位进程中,而不是字面上的MSIL(它是,但32位exe也是)