C#编译器生成的.exe文件是否仅由通用中间语言(CIL)组成?

问题描述 投票:0回答:2

我只是想更好地了解将以下代码添加到文件并以 .cs 扩展名保存时在简单场景中会发生什么:

public class HelloWorld
{
  public static void Main()
  {
    System.Console.WriteLine("Hello World!");
    System.Console.ReadLine();
  }
}

然后该程序在 Windows 命令行中运行:

C:\Windows\Microsoft.NET\Framework\v4.0.30319>csc /t:exe /out:C:\HelloWorld\HelloWorld.exe C:\HelloWorld\HelloWorld.cs

我可以看到这个过程生成了一个 .exe 文件,但是当阅读维基百科上的编译过程时,它指出:

  1. 源代码转换为通用中间语言 (CIL),CLI 相当于 CPU 的汇编语言。
  2. 然后将 CIL 组装成所谓的字节码形式,并创建 CLI 程序集。
  3. 执行 CLI 程序集后,其代码将通过运行时的 JIT 编译器以生成本机代码...
  4. 本机代码由计算机的处理器执行。

那么 .exe 文件本身仅包含通用中间语言吗? 这个文件本身就是维基百科文章中所说的“CLI 程序集”吗? 我有点困惑,因为我只能看到 .exe 文件,对我来说,“程序集”一词意味着多个文件。

及相关问题:

  • JIT 编译器是否位于 Microsoft.NET 目录中的某个位置,并且在执行 .exe 文件时,该文件与 JIT 编译器通信,然后 JIT 编译器以本机代码输出指令?
c# .net cil
2个回答
13
投票

不,不是。

可执行文件是一个 PE 映像

有关详细信息,请参阅.NET 程序集剖析 – PE 标头

.NET 程序集构建在用于所有 Windows 可执行文件和 dll 的 PE(可移植可执行文件)文件格式之上,而 PE(可移植可执行文件)文件格式本身又构建在 MSDOS 可执行文件格式之上。其原因是,当 .NET 1 发布时,它并不像现在那样成为操作系统的内置部分。在 Windows XP 之前,.NET 可执行文件必须像任何其他可执行文件一样加载,必须执行本机代码来启动 CLR 来读取和执行文件的其余部分。


2
投票

它称为汇编,因为包含多个语义数据:

  • 代码
  • 体现
  • 0个或更多模块

如果在任何 CLR 程序集(EXE 或 DLL)上运行简单的工具,例如:DotPeek,您将看到

IL
说明。

© www.soinside.com 2019 - 2024. All rights reserved.