CLR基础

CLR(Common Language Runtime)

  clr 公共语言运行时,和java虚拟机一样是一个可以有多重编程语言(c#,c++,vb)使用的运行时环境,核心功能是内存管理,程序集加载,安全性,异常处理和线程同步。面向clr的所有语言都可以使用核心功能。在运行时clr不关心开发人员使用的是什么语言开发的源代码,因为针对每种语言都有一个面向clr的代码编译器,例如c#有针对c#的编译器,c++也有它自己的编译器。编译器将其最终生成托管模块。

托管模块

托管模块是32位或者64位的windows可移植执行体pe32文件。需要clr才能运行。它包含四部分内容。
  1. IL中间代码优或托管代码,编译器编译源代码时生成的代码,在运行时,CLR将IL编译成本机cpu指令。IL语言是和运行平台无关和特定cpu无关的机器语言,它最终会被编译成当前计算机的cpu指令。
  2. 元数据,每个托管代码都包含元数据表,有两种表,一种是描述代码中定义的类和成员,另一种描述源代码引用的类和成员。元数据管理了关于程序运行的所有问题,类型安全,字段序列化,垃圾回收等
  3. CLR头,包含是这个模块成为托管模块的信息,clr版本,入口方法,强名称等
  4. pe32头,来确定程序是在32位系统还是64位上运行,还有其他本机信息

 

程序集和托管模块

clr实际不和托管模块工作,它和程序集工作。程序集是一个抽象概念,他是一个或多个模块/资源文件的逻辑分组,程序集是重用和安全性以及版本控制的最小单元。例如一个项目的开发团队,会有一个或者是多个的“成员”组成,这些“成员”里必定会有一个负责人。团队外部的人要和这个团队打交道,他们只需要知道这个团队的负责人即可。因为这个负责人“成员”知道这个团队内部的一切情况。在很多情况下,团队外部的人员会以负责人的名称来称呼这一个团队。在这里,团队是一个逻辑的概念,并不是特指某个人或资源。
    团队 = 程序集
    负责人 = 主模块(下面会说明与普通模块的区别)
    成员 = 普通模块
    在很多情况下,我们会用主模块的特征(如名称)来称呼一个程序集。即(用负责人“成员”的特征来称呼一个团队)
CLR是以程序集为单位进行加载的。但是,CLR只会加载被引用到的模块,没有引用的模块不会加载。因此,可以将程序集分为多个模块,运行程序时,只要保证有被引用到的模块存在即可,可以减少加载的程序集文件大小;特别是当程序集是通过网络传输加载时。
生成的每隔程序集可以是可执行程序exe,也可以是dll被调用执行。

 

托管代码:在CLR监视下运行的程序属于“托管代码”,而不再CLR监视下直接在裸机上运行的程序属于“非托管代码”。非托管代码可以对系统进行低级控制,可以按照自己的想法管理内存,更方便的创建线程。c++编译器默认生成包含非托管代码的模块,并在运行时操作非托管内存数据。这些模块不需要clr就可运行,c++的编译器是独一无二的,它允许开发人员同时写托管代码和非托管代码,并生成到同一模块中。

 

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

可操控执行的含义:对象在执行的过程中完全被运行时环境所控制。运行时环境提供以下服务:自动内存管理、调试支持、增强的安全性及与非可操控性代码的互操作性

 

 

FCL(framework class library) framework类库
是一组DLL程序集的统称,是微软发布的数千个类型的定义,包含了很多辅助功能。开发人员可以利用这些程序集创建应用程序,例如:windows控制台,windows服务,web应用等
CTS (common type system) 通用类型系统:
CLR一切都围绕类型展开,类型向应用程序和其他类型公开功能,类型是clr的根本,所以微软制订了正式的规范来描述类型的定义和行为;
例如cts规范规定了一个类型可以有0个或多个成员,成员包括字段,方法,属性,事件。cts他还规定了类型和成员的访问规则,例如标记为public还是product等。
除此之外类型还定义了类的继承规则,虚方法,对象生存周期等。例如所有类型都必须从system.object继承,object就是其他类型的根类型,因为保证了你创建的每个类型实例都有一组基本的行为,例如:比较实例的相等性,获取实例的哈希码,查询实例的类型,执行实例的浅拷贝等
CLS (common language specification)公共语言运行规范:
CLR集成了所有的语言,用一个语言创建的对象在另外一个语言中具有和它自己语言创建的对象同等的地位,但是各种语言在语法上存在很大差别,要创建其他语言都能访问的类型只能从自身语言床挑选其他语言可识别的功能;微软提供了一种语法规则,凡是符合cls公共语言允许规范的功能就能在其他语言中同样符合其规范的功能访问。它是cts/clr的一个子集。

 

 

 

 
 
 
 
 

 

 
 
 
 
 
 

 

 
 
 
 
posted @ 2014-10-21 15:39  二月长安  阅读(232)  评论(0)    收藏  举报