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

时间:2013-07-17 13:05:41

标签: c# .net compiler-construction cil

当我将以下代码添加到文件并使用.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文件,但在阅读compile process on wikipedia时,它指出:

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

.exe文件本身也只包含Common Intermediate Lanaguage?这个文件本身就是维基百科文章所称的'CLI程序集'吗?我有点困惑,因为我只能看到.exe文件,对我来说,'assembly'这个术语推断出多个文件。

相关问题:

  • 是Microsoft.NET目录中某处的JIT编译器,在执行.exe文件时,文件与JIT编译器通信,然后JIT编译器以本机代码输出指令?

2 个答案:

答案 0 :(得分:12)

不,它没有。

可执行文件是PE image

有关详细信息,请参阅Anatomy of a .NET Assembly – PE Headers

  

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

答案 1 :(得分:1)

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

  • 代码
  • 清单
  • 0个或更多模块

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