| « | October 2026 | » | | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | |
| 公告 |
| 努力学习C#。 |
| Blog信息 |
|
blog名称:Areyan's Blog 日志总数:31 评论数量:10 留言数量:-2 访问次数:140415 建立时间:2005年1月5日 |

| |
|
[.Net]DotNet 中CLR的运行和编译模式 软件技术
阿严 发表于 2006/5/27 0:42:29 |
| .NET程序运行前必须编译,被编译后的程序代码不包括汇编程序指使,而是包括MSIL(Microsoft Intermediate Language指命,它是一种非常低级的语言,可以快速地由(JIT编译)为内部机械代码!
500)this.width=500'>
携带编译好的程序的软件包由许多装配件组成。每个装配件都包含中间语言代码,也包含元数据,代描述装配件中的数据类型和方法。元数据还包括装配件内容的一个简单散列,用于验证该装配件没有被塞满,它还包含版本信息,该装配件调用其它装配件的信息,以及控制权限的信息,代码必须有这些权限才能运行。该程序包含许多装配件,其中一个装配件被指定为一个可执行程序,包含主程序的激活入口点,其它装配件则指定为库。当运行程序时,CLR首先会加载第一个装配件-包括程序主入口的装配件。第二步就是验证代码的“内存类型的安全性”。如果代码只以CLR可以控制的方式访问内存,它就是安全的内存类型。其重要性在于内存类型安全的代码可以保证不读写不属于它的任何内存。这是很重要的,因为.NET有一种机制(应用域),允许多个应用程序运行在同一个过程中,如果是这样,就需要保证任何应用程序都不会访问其它应用程序的内存。如果CLR不能验证代码是内存类型安全的,根据本地安全策略,它就会拒绝运行代码。CLR最后就会运行代码。它为运行的代码创建一个过程,并标记应用域,在该域中放入程序的主纯种。在某些情况下,程序可以请求不放在与其它运行代码相同的过程中,此时CLR只会为该程序创建一个新的应用域。然后,CLR提取代码中需要运行的第一部分,把它从中间语言编译为汇编语言,再在合适的程序纯种中执行它,每次执行流到达一个以前没有执行过的新方法时,该方法就会编译为可执行代码。但这个编译过程只进行一次。该方法编译的、完后,其入口的地址就被编译好的可执行代码地址所替换。这样,就维护了性能,因为代码中只有实际要使用的部分才会被编译。这个过程称为just-in-time编译。注意JIT编译器在编译时,会根据在装配件中指定的编译设置优化代码。运行代码时,CLR会监视其内存的使用。根据监视结果,它在某些情况下会临时中断执行一小段时间(一般是几毫秒),调用无用存储单元收集器,检查程序中的变量,以确定哪些内存区域仍处于满打满算状态,即代码仍在使用它们,而释放不再使用的区域。 |
|
|