【问题标题】:Does the .exe file produced by the C# compiler consist solely of Common Intermediate Language(CIL)?C# 编译器生成的 .exe 文件是否仅包含通用中间语言 (CIL)?
【发布时间】:2013-07-16 01:17:33
【问题描述】:

我只是想更好地了解在将以下代码添加到文件并以 .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. 然后将 CIL 组装成所谓的字节码形式并创建 CLI 程序集。
  3. 在执行 CLI 程序集时,其代码会通过运行时的 JIT 编译器以生成本机代码...
  4. 本机代码由计算机的处理器执行。

那么 .exe 文件本身是否仅包含通用中级语言?这个文件本身是维基百科文章所说的“CLI 程序集”吗?我有点困惑,因为我只能看到 .exe 文件,而对我来说,“程序集”一词推断出不止一个文件。

及相关问题:

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

【问题讨论】:

    标签: c# .net compiler-construction cil


    【解决方案1】:

    不,它没有。

    可执行文件是PE image

    详情请见Anatomy of a .NET Assembly – PE Headers

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

    【讨论】:

      【解决方案2】:

      它调用程序集,因为包含多个语义数据:

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

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

      【讨论】:

      • 我认为您的第三点应该是“1 个或多个模块”,如果没有模块,则无处放置清单。值得注意的是,一个程序集可能跨越多个文件,而没有清单的模块可能属于多个程序集。
      猜你喜欢
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      相关资源
      最近更新 更多