我只是想更好地了解将以下代码添加到文件并以 .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),CLI 相当于 CPU 的汇编语言。
- 然后将 CIL 组装成所谓的字节码形式,并创建 CLI 程序集。
- 执行 CLI 程序集后,其代码将通过运行时的 JIT 编译器以生成本机代码...
- 本机代码由计算机的处理器执行。
那么 .exe 文件本身仅包含通用中间语言吗? 这个文件本身就是维基百科文章中所说的“CLI 程序集”吗? 我有点困惑,因为我只能看到 .exe 文件,对我来说,“程序集”一词意味着多个文件。
及相关问题:
不,不是。
可执行文件是一个 PE 映像。
有关详细信息,请参阅.NET 程序集剖析 – PE 标头。
.NET 程序集构建在用于所有 Windows 可执行文件和 dll 的 PE(可移植可执行文件)文件格式之上,而 PE(可移植可执行文件)文件格式本身又构建在 MSDOS 可执行文件格式之上。其原因是,当 .NET 1 发布时,它并不像现在那样成为操作系统的内置部分。在 Windows XP 之前,.NET 可执行文件必须像任何其他可执行文件一样加载,必须执行本机代码来启动 CLR 来读取和执行文件的其余部分。