DotNet 中CLR的运行和编译模式

转载 2006年05月27日 12:24:00

.NET程序运行前必须编译,被编译后的程序代码不包括汇编程序指使,而是包括MSIL(Microsoft Intermediate Language指命,它是一种非常低级的语言,可以快速地由(JIT编译)为内部机械代码!

  携带编译好的程序的软件包由许多装配件组成。每个装配件都包含中间语言代码,也包含元数据,代描述装配件中的数据类型和方法。元数据还包括装配件内容的一个简单散列,用于验证该装配件没有被塞满,它还包含版本信息,该装配件调用其它装配件的信息,以及控制权限的信息,代码必须有这些权限才能运行。该程序包含许多装配件,其中一个装配件被指定为一个可执行程序,包含主程序的激活入口点,其它装配件则指定为库。

  当运行程序时,CLR首先会加载第一个装配件-包括程序主入口的装配件。第二步就是验证代码的“内存类型的安全性”。如果代码只以CLR可以控制的方式访问内存,它就是安全的内存类型。其重要性在于内存类型安全的代码可以保证不读写不属于它的任何内存。这是很重要的,因为.NET有一种机制(应用域),允许多个应用程序运行在同一个过程中,如果是这样,就需要保证任何应用程序都不会访问其它应用程序的内存。如果CLR不能验证代码是内存类型安全的,根据本地安全策略,它就会拒绝运行代码。CLR最后就会运行代码。它为运行的代码创建一个过程,并标记应用域,在该域中放入程序的主纯种。在某些情况下,程序可以请求不放在与其它运行代码相同的过程中,此时CLR只会为该程序创建一个新的应用域。然后,CLR提取代码中需要运行的第一部分,把它从中间语言编译为汇编语言,再在合适的程序纯种中执行它,每次执行流到达一个以前没有执行过的新方法时,该方法就会编译为可执行代码。但这个编译过程只进行一次。该方法编译的、完后,其入口的地址就被编译好的可执行代码地址所替换。这样,就维护了性能,因为代码中只有实际要使用的部分才会被编译。这个过程称为just-in-time编译。注意JIT编译器在编译时,会根据在装配件中指定的编译设置优化代码。运行代码时,CLR会监视其内存的使用。根据监视结果,它在某些情况下会临时中断执行一小段时间(一般是几毫秒),调用无用存储单元收集器,检查程序中的变量,以确定哪些内存区域仍处于满打满算状态,即代码仍在使用它们,而释放不再使用的区域。

[C++]类级别的访问修饰符 -- 由一道笔试题引起的一道破窗

Question: C++的类默认的访问修饰符是___? Answer: 假如你不知道,你很可能会baidu,你很可能会搜到 “ class 为private,struct为pu...
  • fengnongxp
  • fengnongxp
  • 2012年11月20日 14:20
  • 1155

.Net 中的托管与非托管 (CLR)

CLR(公共语言运行时)          .Net Framework是由彼此独立又相关的两部分组成:CLR和类库,   CLR是它为我们提供的服务,类库是它实现的功能. .NET的大部分特性--...
  • realmagician
  • realmagician
  • 2012年11月25日 20:38
  • 1103

《CLR via C#:框架设计》读书笔记 - CLR寄宿和AppDomain

《CLR via C#:框架设计》读书笔记 - CLR寄宿和AppDomain
  • a2324268086
  • a2324268086
  • 2016年04月22日 00:40
  • 583

C#, .NET Framework, Visual Studio 和CLR之间的关系

原文地址:点击打开链接 1.版本整合:   2..NET Framework 版本差异 版本 发行的功能及其特点            1.0 First Versio...
  • venus_dong
  • venus_dong
  • 2013年07月31日 11:17
  • 1188

CLR如何执行程序集的代码

CLR如何执行程序集的代码
  • sfw_123817
  • sfw_123817
  • 2016年11月10日 11:25
  • 168

当运行多个.net程序的时候,系统中有多少CLR的实例

1)以前一直以为CLR是个运行时环境,所有的。NET程序都是运行在这个运行时环境中的。想想也应该没有问题。后来遇到几篇文章,提到了一个字符串驻留的问题。大意是字符串会一直存在于内存空间中直到CLR终止...
  • badbad_boy
  • badbad_boy
  • 2009年06月12日 15:35
  • 790

C#中CLR(公共语言运行时)与IL(中间代码)

.net平台中的CLR首先要说明的是,.NET平台与C#不是一回事 它是C#,VB.net等程序运行的平台。CLR是公共语言运行时,是 .NET Framework的重要组成部分。它提供了内存管理...
  • Pwiling
  • Pwiling
  • 2016年05月20日 15:00
  • 7113

j2me编译 CLR模式

使用源码demo /* @(#)hello.java  */ /**  *   *  * @author Rong Jiejie  */ import javax.microe...
  • fenyan2669
  • fenyan2669
  • 2017年01月02日 22:47
  • 390

使用 /clr 编译 MFC 可执行文件或规则 DLL

一、使用 /clr 编译 MFC 可执行文件或规则 DLL     1、打开“项目属性”对话框,方法是右键单击“解决方案资源管理器”中的项目并选择“属性”。     2、展开“配置属性”旁...
  • susubuhui
  • susubuhui
  • 2012年06月20日 17:59
  • 1106

什么是CLR?

《CLR via C#》读书笔记 什么是CLR CLR的基本概念 通用语言运行平台(Common Language Runtime,简称CLR...
  • h1091313628
  • h1091313628
  • 2016年02月28日 22:31
  • 261
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DotNet 中CLR的运行和编译模式
举报原因:
原因补充:

(最多只允许输入30个字)