.NET Framework的CLR讲解

什么是CLR

  CLR常用简写词语,CLR是公共语言运行库(Common Language Runtime)和Java虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集等),并保证应用和底层操作系统之间必要的分离。CLR存在两种不同的翻译名称:公共语言运行库和公共语言运行时。

基本信息

  CLR是一个可由多种编程语言使用的运行环境。CLR的核心功能包括:内存管理、程序集加载、安全性、异常处理和线程同步,可由面向CLR的所有语言使用。并保证应用和底层操作系统之间必要的分离。CLR是.NET Framework的主要执行引擎。

  为了提高平台的可靠性,以及为了达到面向事务的电子商务应用所要求的稳定性级别,CLR还要负责其他一些任务,比如监视程序的运行。按照.net的说法,在CLR监视之下运行的程序属于“托管的”(managed)代码,而不在CLR之下、直接在裸机上运行的应用或者组件属于“非托管的”(unmanaged)的代码。其中C#是托管代码,C++是非托管代码。

  CLR将监视形形色色的常见编程错误,许多年来这些错误一直是软件故障的主要根源,其中包括:访问数据元素越界,访问未分配的内存空间,由于数据体积过大而导致的内存溢出,等等。

  NET提供的公共语言运行库是一种多语言执行环境,支持众多的数据类型和语言特性。他管理着代码的执行,并使开发过程变得更加简单。这是一种可操控的执行环境,其功能通过编译器与其他工具共同展现。

  元数据:为了使运行时环境可以向可操控代码提供服务,语言编译器需要产生一种元数据,它将提供在使用语言中的类型、成员、引用的信息。运行时环境使用元数据定位并载入类,在内存中展开对象实例,解决方法调用,产生本地代码,强制执行安全性,并建立运行时环境的边界。

  可操控执行的含义:对象在执行的过程中完全被运行时环境所控制。运行时环境提供以下服务:自动内存管理、调试支持、增强的安全性及与非可操控性代码的互操作性。条件:1、选择以运行时为目标的语言编译器,如VB、C#;2、在组件的输出类型中使用CLR要求的语言特性。

内存管理 

  内存管理的自动化:在执行过程中管理应用程序的资源是一项单调而困难的工作。它会将你的注意力从你本应解决的问题中引开。而垃圾收集机制完全解决了程序员在编程过程中头痛的问题,跟踪内存的使用,并知道何时将它们释放。

在面向对象的环境中,每种类型都标识了对你的应用程序有用的某种资源。为了使用这些资源,你需要为类型分配内存。在应用中,访问一种资源要通过以下步骤:

  (1)为类型分配内存。

  (2)初始化内存,设置资源的初始状态并使其可用。

  (3)通过访问该类型的实例成员来访问资源。

  (4)卸下将被清除的资源状态。

  (5)释放内存。

  这一看似简单的过程在实际的编程中是产生错误的主要来源之一。更可怕的是:内存中的错误往往导致不可预见的结果。如果你有过编程的经验,想想看,有多少次你的程序因为内存访问错误而崩溃?特别是计算机存在多根内存条时特别容易内存报错死机。建议升级电脑时换掉原来的内存,不要采用加内存的方式。

  CLR要求所有的资源从可操控的堆(注:在此指一种内存结构)中分配。当一个进程被初始化后,CLR保留了一个未被分配的地址空间。这一区域叫做可操控堆。在堆中保持了指向下一个将被分配给对象的堆地址的指针(NEXT)。

  初始状态下,该指针是保留地址空间的基地址。一个应用使用新的操作产生对象。此操作首先检查新对象需要字节的大小是否会超出保留空间。如果对象大小合适,指向下一个地址的指针将指向堆中的这个对象,该对象的构造器被调用,新的操作返回对象的地址。

  当一个应用请求建立一个对象时,地址空间可能不够大。堆将发现这一点(通过将新对象的大小与NEXT指针相加,并与堆的大小进行比较),这时垃圾收集器就将被调用。在这里,CLR引入了“代”的概念。代,指堆中对象产生的先后。这样,垃圾收集器在将发生溢出时回收属于特定的“代”的对象,而不是回收堆中的所有对象。

  (6)即时编译

  在各种语言的编译器源代码进行编译之后,在CLR环境中产生的是中间代码(出于兼容性与跨语言集成的考虑),其内容虽然有效,但在转化为本地代码之前它本身是不可执行的。这就是JIT编译器需要完成的工作。

  这里需要说明一个问题:为什么要即时编译,而不是一次性的将中间代码文件进行编译?答案很简单:原因在于效率。在大型的应用中,你很少会用到程序的全部功能,这种边执行边编译的措施比一次性的完全编译效率更高。

  CLR带有三个不同的JIT编译器,在Windows平台中,CLR带有三个不同的JIT编译器:

  (1)缺省的编译器---主编译器,由它进行数据流分析并输出经过优化的本地代码,所有的中间代码指令均可被它处理。

  (2)PREJIT,它建立在主JIT编译器之上。其运行方式更象一个传统的编译器:每当一个.NET组件被安装时它就运行。

  (3)ECONOJIT,在并不充分优化的前提下,它能够快速完成IL代码到本地码的转换,编译速度与运行速度都非常快。

  为了配合编译器的工作,在.NET SDK的安装路径下的/bin目录中有一个负责管理JIT的应用程序:jitman.exe。具体的使用参见联机帮助。

时间: 2024-10-13 21:53:47

.NET Framework的CLR讲解的相关文章

C#、.NET Framework、CLR的关系

C#..NET Framework.CLR的关系 很多人没有将C#..NET Framework(.NET框架).CLR(Common Language Runtime,公共语言运行库)这三者之间的关系区分清楚,认为其版本号是一一对应的.其实不然,.NET框架是一个独立发布的软件包,其包含了CLR.类库以及相关的语言编辑器等工具.C#代码经过编译之后在CLR环境中运行.由于.NET框架3.0/3.5其实是.NET2.0的扩展(只是增加了一些新的程序集),所以.NET3.0/3.5的CLR版本还是

.NET Framework的CLR提供了三种方法来完成对共享资源

.NET Framework的CLR提供了三种方法来完成对共享资源 ,诸如全局变量域,特定的代码段,静态的和实例化的方法和域. (1) 代码域同步:使用MonITor类可以同步静态/实例化的方法的全部代码或者部分代码段.不支持静态域的同步.在实例化的方法中,this指针用于同步:而在静态的方法中,类用于同步,这在后面会讲到. (2) 手工同步:使用不同的同步类(诸如WaitHandle, Mutex, ReaderWrITerLock, ManualResetEvent, AutoResetEv

Hello World基于.net framework中CLR的执行

1 static void Main(string[] args) 2 { 3 Console.WriteLine("Hello,World!"); 4 Console.WriteLine("Hello,World!"); 5 } 一个很简单的Hello World程序在.net framework平台究竟是如何在计算机上运行的呢? 下面我将简单解答一下这个问题: 首先介绍CLR(公共语言运行时),CLR是一个可有多种编程语言使用的"运行时",C

查看本地安装的 .NET Framework(CLR) 版本

方法一:%SystemRoot%\Microsoft.NET\Framework 要了解安装了哪些版本的 .NET Framework,可以通过检查下面目录的子目录解决: %SystemRoot%\Microsoft.NET\Framework %SystemRoot%\Microsoft.NET\Framework64 (%SystemRoot%即目录C:\Windows) 也可以在命令行中输入下面命令,筛选出我们关注的结果: %SystemRoot%\Microsoft.NET\Framew

.net平台 .net Framework 组织结构 .net Framework类库 CLR C# 介绍

一..net平台 .NET现在可以看成微软的一个品牌,微软有两个非常成功的品牌,那就是Windows和Office. .NET会成为微软的另一个品牌.它不仅仅是一组技术,产品,或服务(微软的服务包括MSN, Passport, MSDN订阅,等等)一个品牌具有一些特征,如Rolex是一个手表品牌,它代表了高质量,时尚,昂贵,成功,等等. 二..net Framework组织结构 主要包括三部分:1.公共语言规范 2..NET Framework类库 3.公共语言运行库CLR(托管和执行代码) 三

浅谈.NET Framework 与CLR

承载公共语言运行时 (CLR) 的所有应用程序均需启动(或称“激活”)CLR 以运行托管代码.             通常,.NET Framework 应用程序在生成它的 CLR 版本上运行,但您可以使用应用程序配置文件(有时称为 app.config 文件)来更改桌面应用程序的此行为.  但是,您不能使用应用程序配置文件来更改 Windows 应用商店应用或 Windows Phone 应用程序的默认激活行为.  本文说明如何使桌面应用程序能够在 .NET Framework 的其他版本上

.NET framework 与CLR

承载公共语言运行时 (CLR) 的所有应用程序均需启动(或称“激活”)CLR 以运行托管代码.             通常,.NET Framework 应用程序在生成它的 CLR 版本上运行,但您可以使用应用程序配置文件(有时称为 app.config 文件)来更改桌面应用程序的此行为.  但是,您不能使用应用程序配置文件来更改 Windows 应用商店应用或 Windows Phone 应用程序的默认激活行为.  本文说明如何使桌面应用程序能够在 .NET Framework 的其他版本上

.NET Framework CLR 版本检测

我写了一个 C# 程序来检测 .NET Framework CLR 版本. 在 Ubuntu 操作系统中的运行结果: [email protected]:~/work$ ./ClrInfo.exe OS Version: Unix 2.6.31.16 CLR Version: 2.0.50727.1433 ( Mono 2.4.2.3 ) Default Encoding: System.Text.UTF8Encoding Available Frameworks: Mono 1.0 Profi

[转].NET Framework、C#、CLR和Visual Studo之间的版本关系

原文地址:http://www.xcode.me/more/microsoft-net-framework-version-define C#版本 .NET Framework版本 CLR版本 VisualStudio版本 C#1.0 .NET Framework 1.0 CLR1.0 Visual Studio 2002 C#1.2 .NET Framework 1.1 CLR1.1 Visual Studio 2003 C#2.0 .NET Framework 2.0 CLR2.0 Visu