首页 > 编程 > .NET > 正文

精品赏析:一个.NET程序在编译和运行时都做了些什么?

2024-07-10 13:02:12
字体:
来源:转载
供稿:网友


收集最实用的网页特效代码!

一个.net程序在编译和运行时都做了些什么?
================================================================
在新闻组和邮件列表里有大量关于一个.net程序的设计编译(design-time or
run-time)和运行原理 (cpu-specific binary or pseudo-code)的疑问。

这里是一个简单的回答:当你编译一个c#应用程序或任何一种cls(commmon
language specification)兼容的语言时,它将首先被编译成一种称为il
(intermediate language)的伪代码(pseudo-code)。在这个应用程序第一次
被运行的时候,这种il代码将被编译成机器代码,用于执行。也就是说从源代码
到得到运行结果,进行了两次编译。事实上,只有那些被真正使用的函数代码
才会被进行第二次编译。下面揭示开发过程中被隐藏起来的细节:

1) 你用c#开发一些程序
2) 用c#编译器或cls兼容的编译器编译成exe
3) 编译器将生成的il代码和附加信息(manifest)放入拥有一个标准pe头的win32
可执行文件的只读部分。
4) 编译器在创建这个可执行文件时导入(import)一个名为_corexemain的函数。
这个函数是.net ee(execution engine)--.net运行期引擎的入口函数。
5) 当执行这个win32可执行文件时,因为其主要是依赖于dll的pe文件,操作系
统将会调用位于mscoree.dll中的_corexemain函数。
6) 操作系统通过pe文件里的进入点,调用mscoree.dll。并能保证在windows里
可以有很多程序同时运行。
7) 因为操作系统不能执行.net il代码,exe里的进入点只是简单的中介,它将
指示操作系统调用_corexemain函数。
8) 随后_corexemain函数开始解释位于pe文件中的il代码。
9) 因为il是不能被直接执行的, .net ee使用称为jitter (just in time compiler)
的即时编译器将il代码编译成本地cpu机器代码用于执行。这一即时编译过程
只在第一次执行的时候进行。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表