CLR的执行模型

 

CLR的执行模型

1.       将源代码编译成托管模块

托管模块是一个标准的32/64Microsoft Windows 可移植执行体(PE32/PE32+)文件,需要CLR才能执行。它包括

PE32PE32+

CLR

元数据

IL

元数据用途:

在编译时,元数据消除了对头和库文件的需求。

智能感知特性能解析元数据,指出一个类型提供了什么方法、属性、事件和字段。

CLR的代码验证过程使用元数据来确保代码只执行“安全”的操作。

元数据允许将一个对象的字段序列化到一个内存块中,发送给另一台机器,然后反序列化,在远程机器上重建对象状态。

元数据允许垃圾收集器跟踪对象的生存期。垃圾收集器能判断任何对象的类型,并根据元数据知道哪个对象中的哪些字段应用了其他对象。

2.       将托管模块合并成程序集(EXEDLL)

程序集是一个或多个模块/资源文件的逻辑性分组,包含一个清单。清单是由元数据表构成的另一种集合。

程序集是最小的可重用、安全性以及版本控制单元,有单文件程序集和多文件程序集之分。(可以把很少用到的类型和资源放到一些单独的文件中,并把这些文件作为程序集的一部分)程序集具有自描述性,包含被引用的程序集有关的信息。

CLR中,程序集称为组件。

3.       加载CLR

CLRVer.exe  -all  列出本机安装的所有CLR版本

/platform命令开关(项目属性中的生成) 指定运行平台

Wow64Windows on Windows64)技术

    Windows检查EXE文件头,判断创建32/64/WoW64中的一种进程之后,在进程地址空间中加载MSCorEE.dllx86/x64/IA64中一个版本。然后,进程的主线程调用MSCorEE.dll内部定义的一个方法。这个方法初始化CLR,加载EXE程序集,然后调用其入口方法(Main)。随即,托管应用程序将启动并运行。

4.       执行程序集的代码

IL可以当作一种面向对象的汇编语言。它是基于堆栈的,是无类型的(typeless)。IL的优势不仅在于脱离了底层CPU的一种抽象,更重要的是提供应用程序的可靠性和安全性。在将IL编译成本地CPU指令前,CLR会执行一个名为“验证”的过程,确保代码所做的一切都是安全的。如:核实调用的每个方法都有正确数量的参数,传给每个方法的参数都具有正确的类型,每个方法的返回值都得到了正确的使用,每个方法都有一个return语句。

 

高级语言通常只揭示了 CLR 的一个功能子集, IL 可以访问 CLR 的所有功能。

    JITjust-in-time即时)编译器,把IL转换成本地CPU指令。

下图展示了首次调用一个方法时发生的事情:



    在
Main方法执行之前,CLR会检测出Main的代码引用的所有类型。这导致CLR分配一个内部数据结构,它用于管理对引用类型的访问。在图中,Main方法引用了一个Console类型,所以CLR分配一个Console内部数据结构。在这个内部数据结构中,Console类型定义的每个方法都有一条对应的记录。每条记录都容纳了一个地址,根据此地址即可找到方法的实现。对这个结构进行初始化时,CLR将每条记录都设置成CLR内部包含的一个未文档化的函数,称为JITCompiler

Main方法首次调用WriteLine时,会调用JITCompiler函数。JITCompiler函数负责将一个方法的IL代码编译成本地CPU指令(如图所示)。Main方法第二次调用WriteLine时,直接执行内存块中的CPU指令。一个方法只有在第一次调用时才会造成一定的性能损失。不必担心托管应用程序的性能。

    
JIT编译器将本地CPU指令保存在动态内存中。一旦应用程序终止,编译好的CPU指令也会被丢弃。所以,如果将来再次运行应用程序,或者同时启动了应用程序的两个实例,JIT编译器必须再次将IL编译成本地CPU指令。

/optimize/debug(两个C#编译器开关)会影响IL代码和本地CPU指令。项目的Debug配置是/optimize-/debugfull,即对IL和本地CPU指令都未优化;Release配置是/optimize+/debugpdbonly,即对IL和本地CPU指令都进行了优化。

NGen.exe工具将一个程序集的所有IL代码编译成本地代码,并将这些本地代码保存到一个磁盘文件中。但是,它没有对代码进行高度的优化。


转载于:https://www.cnblogs.com/Sandwi/archive/2007/11/18/963396.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值