CLR在.NET中的作用是十分重要的,如果要完全掌握.NET那么理解CLR运行原理就是必然的事情。比如,你想在程序中实现动态获取程序集信息,动态创建,后期绑定,反射等特性,那么正确的理解CLR的原理就显得格外的重要。
的代码-----MSIL(中间语言)
平台无关本机代码, MSIL使用.NET支持的语言所编写的代码,JIT 编译.
MSIL(Microsoft Intermediate Language)微软的中间语言和JAVA的虚拟机类似,是与CPU无关的指令集。当编译为托管代码时,编译器将源代码翻译为MSIL,MSIL 包括用于加载、存储和初始化对象以及对对象调用方法的指令,还包括用于算术和逻辑运算、控制流、直接内存访问、异常处理和其他操作的指令。
在可以执行代码前,必须将 MSIL 转换为 CPU 特定的代码,这通常是通过实时 (JIT) 编译器完成的。由于公共语言运行库为它支持的每种计算机结构都提供了一种或多种 JIT 编译器,因此可以在任何受支持的结构上对同一组 MSIL 进行 JIT 编译和执行。
这样总结上面的就是:中间语言是一组独立于CPU的指令集,它可以被即时编译器Jitter翻译成目标平台的本地代码。
关于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文件),操作系统载入PE文件,以及其他的DLL(.NET动态连接库)。操作
系统装载器根据PE文件中的可执行文件头跳转到程序的入口点。显然,操作系统并不能执行中间语言,该入口点也被
设计为跳转到mscoree.dll(.
NET平台的核心支持DLL)的_ CorExeMain()函数入口。CorExeMain()函数开始执行PE文件中的中间语言代码。这里的执行的意思是CLR(通用语言运行时)按照调用的对象方法为单位,用JIT(即时编译器)将中间语言编译成本地机二进制代码,执行并根据需要存于机器缓存。程序的执行过程中,GC(垃圾收集器)负责内存的分配,释放等管理功能。程序执行完毕,操作系统卸载应用程序。
二:使用同一种语言——— CLR (公共语言运行时)
1.跨语言应用
当编程人员在用自己喜欢的编程
语言写
源代码的时候, 这个源代码在被转化成媒介语言(IL)之前,先被编译成了一个独立的可执行单元(PE)。这样无论你是一个VB.NET程序员,或一个C#程序员,甚至是使用托管的C++的程序员。只要被编译成IL就是同等的。
首先,编译输出的exe是一个由中间语言(IL),元数据(Metadata)和一个额外的被编译器添加的目标平台的标准可执行文件头(比如Win32平台就是加了一个标准Win32可执行文件头)组成的PE(portable executable,可移植执行体)文件,而不是传统的二进制可执行文件--虽然他们有着相同的扩展名。中间语言是一组独立于CPU的指令集,它可以被即时编译器Jitter翻译成目标平台的本地代码。中间语言代码使得所有Microsoft.NET平台的高级语言C#,
VB.NET,VC.NET等得以平台独立,以及语言之间实现互操作。元数据是一个内嵌于PE文件的表的集合。
2.安全性
.NET提供了一组安全
方案。负责进行代码的访问安全性检查。允许我们对保护资源和操作的访问。代码需要经过身份确认和出处鉴别后才能得到不同程度的信任。安全策略是一组可