如何以及何时.NET实际编译code? [英] How and when does .NET actually compile code?

查看:136
本文介绍了如何以及何时.NET实际编译code?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

比方说,你写在C#,VB,任何与.NET的应用程序 当你击筑,它真的编译code?我是这么认为的,直到我开始使用redgates反射对我的一些组件,看到我的code一字不差。我本来期望循环,以解开和优化的另一个多如牛毛,而不是什么都没有。

Let's say you write an app in C#, VB, anything with .NET When you hit build, does it really compile your code? I thought so until I started using redgates reflector on some of my assemblies and saw my code verbatim. I would have expected loops to be unrolled and another plethora of optimizations, instead nothing.

所以当它编译实际发生的呢?我认为它是建立时,code成为IL(中间语言),当执行时,它被装在CLR?难道CLR优化过程中只,从来没有在制作的时候?

So when does the compilation actually happen? I think when it is built, code become IL (Intermediary Language) and when execution occurs, it is loading in the CLR? Is it optimized during CLR only and never at build time?

推荐答案

当你在VS编译

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

当你执行:

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

我张贴的答案在这里也为另一个问题是不是真的这个...

I post the answer here too as the other question was not really about this...

这篇关于如何以及何时.NET实际编译code?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆