理解 .NET 中的 CLR 原理
** 作者: ** ** yarshray saga join ** ** (如要转载请附上作者,谢谢!) ** ** **
首先本文是的目的是要让大家明白, CLR 在。 NET 中的作用是十分重要的,如果要完全掌握。 NET 那么理解 CLR 运行原理就是必然的事情。比如,你想在程序中实现动态获取程序集信息,动态创建,后期绑定,反射等特性,那么正确的理解 CLR 的原理就显得格外的重要。
下面让我来做一个整体的介绍,来帮助你来了解 CLR 中的一些另人激动的特性。理解这些特性将更好的帮助你来理解 CLR 。
** * ** ** 与本机代码无关 ** ** ** ** ——— ** ** MSIL ** ** (中间语言) ** ** **
** * ** ** 让我们使用同一种语言 ** ** ** ** ——— ** ** CLR ** ** (公共语言运行时) ** ** **
** * ** ** 我们手中的零件 ** ** ** ** ——— ** ** Assembly ** ** (装配件) ** ** **
** * ** ** 让我们在同一个系统中运行 ** ** ** ** ——— ** ** CTS ** ** (通用类型系统) ** ** **
** * ** ** 宇宙大爆炸后的产物 ** ** ** ** ——— ** ** metadata ** ** (元数据) ** ** **
** * ** ** 让我们的语言可以交流 ** ** ** ** ——— ** ** CLS ** ** (公共语言系统) ** ** **
** * ** ** 在动态中交互 ** ** ** ** ——— ** ** Reflection ** ** (反射) ** ** **
** * ** ** 属于我们自己的空间 ** ** ** ** ——— ** ** NameSpace ** ** (名称空间 ** ** ) **
本文的目的力求做到精简,要精简,就不得不省去细节,但为了全面和完整我会在文中放连接,那样,可以让读者对自己感兴趣或希望有更多了解的地方进行深入的了解。(注:连接有部分为 MSDN 中内容,因此你必须要安装。 NET 的合并 MSDN 才可查看。)
词汇:
由于我想简写,因此会直接采用原词。但为了帮助理解,我在这里给出翻译:
** MSIL: ** ** 微软中间语言 ** ** ** ** **
|
** Reflection: ** ** 反射 ** ** **
---|---
** Metadata: ** ** 元数据 ** ** **
|
** PE: ** ** 可执行可移植文件 ** ** **
** Assembly: ** ** 程序集(装配件) ** ** **
|
** NameSpace: ** ** 名称空间 ** ** **
** CTS: ** ** 通用类型系统 ** ** **
|
** GC(Garbage Colection) : ** ** 无用单元回收 ** ** **
** CLR: ** ** 公共语言系统 ** ** **
|
** Attribute: ** ** 属性(注意不要和 ** ** Property ** ** 混淆) ** ** **
** Boxing: ** ** 装箱 ** ** **
|
** UnBoxing: ** ** 拆箱 ** ** **
** 正文:下面让我们进入整文 **
* 与本机代码无关 ——— MSIL (中间语言)
1 .谈谈 MSIL
图例:
平台无关本机代码
MSIL
使用。 NET 支持的语言所编写的代码
JIT
编译
MSIL(Microsoft Intermediate Language) 微软的中间语言。和 JAVA 的虚拟机类似,是与 CPU 无关的指令集。当编译为托管代码时,编译器将源代码翻译为 MSIL ,
如上图所示。 MSIL 包括用于加载、存储和初始化对象以及对对象调用方法的指令,还包括用于算术和逻辑运算、控制流、直接内存访问、异常处理和其他操作的指令。在可以执行代码前,必须将 MSIL 转换为 CPU 特定的代码,这通常是通过实时 (JIT) 编译器完成的。由于公共语言运行库为它支持的每种计算机结构都提供了一种或多种 JIT 编译器,因此可以在任何受支持的结构上对同一组 MSIL 进行 JIT 编译和执行。这样总结上面的就是: 中间语言是一组独立于 CPU 的指令集,它可以被即时编译器 Jitter 翻译成目标平台的本地代码。
2 .谈谈 PE
Windows PE 和一个 .NET PE 的主要区别在于 Windows PE 是由操作系统执行的,而 .NET PE 却被转变成为 .NET Framework 的 CLR. 识别一个 PE 是 .NET 还是 Windows 取决于他的通用的目标文件格式 (COFF) 是否使用 Windows 的操作系统 . 目标文件格式 (COFF) 指定了任何文件都分成两个部分:文件数据本身以及描述文件内包含的数据内容的头文件串。
MSIL 汇编程序从 MSIL 汇编语言生成可移植可执行的 (PE) 文件。可以运行结果可执行文件(该文件包含 MSIL 和所需的元数据)以确定 MSIL 是否按预期执行。这就是我为什么会谈到 PE 。
。 NET 中的 PE 参考:
http://www.csdn.net/Develop/article/13%5C13683.shtm
。 NET 中的 PE
** .NET PE File Format **
|
l COFF and PE Headers
l Code and Data Sections
l Metadata Tables and IL Organization
l Java Class File Format vs. .NET PE File For
---|---
那么 PE 文件是怎么执行的呢?下面是一个典型的 .NET 应用程序的执行过程:
- 用户执行编译器输出的应用程序 (PE 文件 ) ,操作系统载入 PE 文件,以及其他的 DLL(.NET 动态连接库 ) 。
- 操作系统装载器根据 PE 文件中的可执行文件头跳转到程序的入口点。显然,操作系统并不能执行中间语言,该入口点也被设计为跳转到 mscoree.dll ( .NET 平台的核心支持 DLL )的 _ CorExeMain() 函数入口。
- CorExeMain() 函数开始执行 PE 文件中的中间语言代码。这里的执行的意思是 CRL (通用语言运行时)按照调用的对象方法为单位,用 JIT( 即时编译器 ) 将中间语言编译成本地机二进制代码,执行并根据需要存于机器缓存。
- 程序的执行过程中, GC( 垃圾收集器 ) 负责内存的分配,释放等管理功能。
- 程序执行完毕,操作系统卸载应用程序。
3. 工具参考:
MSIL 反汇编程序是 MSIL 汇编程序 (Ilasm.exe) 的伙伴工具。Ildasm.exe 采用包含 Microsoft 中间语言 (MSIL) 代码的可移植可执行 (PE) 文件,并创建相应的文本文件作为 Ilasm.exe 的输入。
ms-help://MS.VSCC/MS.MSDNVS.2052/cptools/html/cpconmsildisassemblerildasmexe.htm
* 让我们使用同一种语言 ——— CLR (公共语言运行时)
1 . CLR 的特性:
1 .跨语言应用
当编程人员在用自己喜欢的编程语言写源代码的时候 , 这个源代码在被转化成媒介语言( IL )之前,先被编译成了一个独立的可执行单元( PE )。这样无论
你是一个 VB 。 NET 程序员,或一个 C# 程序员,甚至是使用托管的 C++ 的程序员。只要被编译成 IL 就是同等的。
首先,编译输出的 exe 是一个由中间语言( IL ),元数据 (Metadata) <SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: ˎ̥; mso-hansi-font-family: &