当前位置:  开发笔记 > 编程语言 > 正文

.NET如何以及何时实际编译代码?

如何解决《.NET如何以及何时实际编译代码?》经验,为你挑选了1个好方法。

假设您在C#,VB中编写应用程序,使用.NET编写任何内容当您点击构建时,它是否真的编译了您的代码?我一直这么想,直到我开始在我的一些装配上使用redgates反射器并逐字地看到我的代码.我本来期望循环展开和另外多次优化,而不是什么.

那么编译什么时候实际发生?我认为当它构建时,代码变成IL(中介语言),并且当执行时,它正在加载到CLR中?它是仅在CLR期间优化而从未在构建时进行优化的吗?



1> Jorge Córdob..:

在VS中编译时

    您的源代码被编译为称为公共中间语言(CIL)或MSIL(Microsoft中间语言)的字节代码.

    来自每个类和每个方法(以及所有其他事物:O)的元数据都包含在生成的可执行文件的PE头中(无论是dll还是exe).

    如果您正在生成可执行文件,则PE Header还包括一个传统的引导程序,它在您执行可执行文件时负责加载CLR(公共语言运行库).

执行时:

    bootstraper初始化CLR(主要通过加载mscorlib程序集)并指示它执行程序集.

    CLR执行您的主条目.

    现在,类有一个包含方法函数地址的向量表,因此当您调用MyMethod时,将搜索此表,然后对该地址进行相应的调用.启动后,所有表的所有条目都具有JIT编译器的地址.

    当调用其中一个方法时,调用JIT而不是实际方法并控制.然后,JIT将CIL代码编译为适合的体系结构的实际汇编代码.

    编译代码后,JIT进入方法向量表并将地址替换为已编译的代码之一,以便每个后续调用不再调用JIT.

    最后,JIT处理已编译代码的执行.

    如果你调用另一个尚未编译的方法,那么回到4 ...依此类推......

我也在这里发布答案,因为另一个问题并不是真的这个......

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有