C#编译器生成的.exe文件是否仅由公共中间语言(CIL)组成
本文关键字:中间语言 CIL 组成 编译器 exe 是否 文件 | 更新日期: 2023-09-27 18:22:43
我只是想更好地了解在一个简单的场景中,当以下代码添加到文件中并用.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文件,但是当阅读维基百科上的编译过程时,它指出:
- 源代码转换为通用中间语言(CIL),这相当于CPU的CLI汇编语言
- 然后将CIL组装成所谓的字节码形式,并创建CLI程序集
- 在执行CLI程序集时,它的代码会通过运行时的JIT编译器来生成本机代码
- 本机代码由计算机的处理器执行
那么,.exe文件本身是否只包含Common Intermediate Lanaguage?这个文件本身就是维基百科文章所说的"CLI程序集"吗?我有点困惑,因为我只能看到.exe文件,而"程序集"一词对我来说意味着不止一个文件。
以及相关问题:
- JIT编译器是否在Microsoft.NET目录中,并且在执行.exe文件时,该文件与JIT编译器通信,然后JIT编译器以本机代码输出指令
不,不是。
可执行文件是PE映像。
有关详细信息,请参阅.NET程序集的剖析-PE标头。
.NET程序集是在PE(可移植可执行文件)文件格式的基础上构建的,PE文件格式用于所有Windows可执行文件和dll,而dll本身是在MSDOS可执行文件格式之上构建的。原因是当.NET 1发布时,它并不像现在这样是操作系统的内置部分。在WindowsXP之前,.NET可执行文件必须像其他可执行文件一样加载,必须执行本机代码才能启动CLR来读取&执行文件的其余部分。
它调用汇编,因为它包含多个语义数据:
- 代码
- 舱单
- 0个或多个模块
如果在任何CLR程序集(EXE或DLL)上运行类似DotPeek的简单工具,您将看到IL
指令。