如何以及何时.NET实际编译的代码?(How and when does .NET actually

2019-06-28 04:00发布

比方说,你写在C#,VB,.NET与任何一个应用程序当你击筑,它真的编译代码? 我是这么认为的,直到我开始使用在我的一些组件redgates反射,看到我的代码逐字。 我没有料想到会被展开和优化的另一个多如牛毛,而不是空无一环。

所以,当它编译实际发生? 我认为,当它建成后,代码成为IL(中间语言)和执行情况时,它加载的CLR? 难道只有从不在构建时CLR中得到优化?

Answer 1:

当你在VS编译

  1. 源代码被编译成称为公共中间语言(CIL)或MSIL(Microsoft中间语言)字节代码。
  2. 从每一个类和每一方法(以及所有其他的事情:O)的元数据被包括在生成的可执行文件的PE头(可能是一个DLL或一个exe)。
  3. 如果你正在制作一个可执行PE文件头还包括传统的引导程序是负责加载CLR(公共语言运行时),当你执行你的可执行文件。

当您执行:

  1. 该bootstraper初始化CLR(主要是通过加载mscorlib程序组件),并指示它执行程序集。
  2. 该CLR执行主项。
  3. 现在,类有其持有的方法函数的地址,这样,当你调用的MyMethod,此表中进行搜索,然后到该地址对应的调用由矢量表。 当开始对所有表中的所有条目有JIT编译器的地址。
  4. 当由这样的方法中的一个的呼叫时,JIT被调用而不是实际的方法和需要的控制。 在JIT然后编译CIL码成用于此时,相应的实际结构的汇编代码。
  5. 一旦代码被编译在JIT进入方法量表和替换编译代码的一个地址,让每一位后续调用不再调用JIT。
  6. 最后,JIT处理执行的编译代码。
  7. 如果你打电话尚未被编译然后回到4 ...等等的另一种方法...

我在这里发表的回答也像其他的问题是不是真的这个...



Answer 2:

它是在,那么,编译时编译成IL。 反射器的神奇之处就在于它“理解”的IL并将其转换回成C#(或VB.NET或什么的。看在反射器的选项菜单下,你可以在任何格式查看装配,包括IL)。

在反射,你居然看不到你的原代码。 您所看到的IL的翻译成C#。 大多数时候,这将是非常相似,你写的,但也有一些蛛丝马迹-例如,找到你实现的地方自动属性 :

string MyProperty {get;set;}

你会看到,实际上编译到,这是这样的:

public string MyProperty
{
    [CompilerGenerated]
    get
    {
        return this.<MyProperty>k__BackingField;
    }
    [CompilerGenerated]
    set
    {
        this.<MyProperty>k__BackingField = value;
    }
}


文章来源: How and when does .NET actually compile code?