首页 > 开发 > .Net > 正文

.NET编译时都做了一些什么

2020-02-03 15:53:47
字体:
来源:转载
供稿:网友


================================================================<br>
faq - 一个.net程序在编译和运行时都做了些什么?<br>
================================================================<br>
在新闻组和邮件列表里有大量关于一个.net程序的设计编译(design-time or<br>
run-time)和运行原理 (cpu-specific binary or pseudo-code)的疑问。<br>
<br>
这里是一个简单的回答:当你编译一个c#应用程序或任何一种cls(commmon<br>
language specification)兼容的语言时,它将首先被编译成一种称为il<br>
(intermediate language)的伪代码(pseudo-code)。在这个应用程序第一次<br>
被运行的时候,这种il代码将被编译成机器代码,用于执行。也就是说从源代码<br>
到得到运行结果,进行了两次编译。事实上,只有那些被真正使用的函数代码<br>
才会被进行第二次编译。下面揭示开发过程中被隐藏起来的细节:<br>
<br>
1) 你用c#开发一些程序<br>
2) 用c#编译器或cls兼容的编译器编译成exe<br>
3) 编译器将生成的il代码和附加信息(manifest)放入拥有一个标准pe头的win32<br>
&nbsp;&nbsp;&nbsp;可执行文件的只读部分。<br>
4) 编译器在创建这个可执行文件时导入(import)一个名为_corexemain的函数。<br>
&nbsp;&nbsp;&nbsp;这个函数是.net ee(execution engine)--.net运行期引擎的入口函数。<br>
5) 当执行这个win32可执行文件时,因为其主要是依赖于dll的pe文件,操作系<br>
&nbsp;&nbsp;&nbsp;统将会调用位于mscoree.dll中的_corexemain函数。<br>
6) 操作系统通过pe文件里的进入点,调用mscoree.dll。并能保证在windows里<br>
&nbsp;&nbsp;&nbsp;可以有很多程序同时运行。<br>
7) 因为操作系统不能执行.net il代码,exe里的进入点只是简单的中介,它将<br>
&nbsp;&nbsp;&nbsp;指示操作系统调用_corexemain函数。<br>
8) 随后_corexemain函数开始解释位于pe文件中的il代码。<br>
9) 因为il是不能被直接执行的, .net ee使用称为jitter (just in time compiler)<br>
&nbsp;&nbsp;&nbsp;的即时编译器将il代码编译成本地cpu机器代码用于执行。这一即时编译过程<br>
&nbsp;&nbsp;&nbsp;只在第一次执行的时候进行。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表