CLR----公共语言运行时

CLR----公共语言运行时

 

前面提到过:程序集包含了CIL语言代码,CIL语言代码是无法直接运行的,需要经过.NET运行时进行即时编译才能转换为计算机可以直接执行的机器指令.接下来就是了解一下这个过程是如何实现的.

 

.NET框架的核心部分:CLR(Common Language Runtime公共语言运行时),有时也叫.NET运行时(.NET Runtime).在了解CLR之前,需要先进一步学习一下程序集,楼主只是简单的说一下便于大家理解CLR.

 

.exe为后缀的控制台应用程序就是一个直接的可执行文件,因为双击之后,他确实可以运行.这里的情况和面向对象中的继承有一点像:一台轿车首先是一部车,一只猫首先是一个动物(为啥动物要按个呢,我一般都说一只动物).同理,一个.NET程序集首先是一个Windows可执行程序.

 

那么什么样格式的文件才是一个windows可执行文件?这个格式被称为PE/COFF,Windows可移植可执行/通用对象文件格式.windows操作系统能够加载并运行.dll.exe是因为它能理解PE/COFF文件的格式.显然,所有在windows系统上运行的程序都需要符合这个格式,当然也包括.NET程序集在内.在这一级,程序的控制权还属于操作系统,PE/COFF头包好了供操作系统查看和利用的信息.此时,程序集可以如下图这样:

 

前面说过,程序集中包含的CIL语言代码并不是计算机可以直接执行的,还需要进行即时编译,那么在对CIL语言代码进行编译前,需要先将编译的环境运行起来,因此PE/COFF头之后的就是CLR头了.CLR头最重要的作用之一就是告诉操作系统这个PE/COFF文件是一个.NET程序集,区别于其他类型的可执行程序:

 

 

CLR头之后就是大家相对熟悉的一些内容了.首先,程序集包含一个清单,这个清单相当于一个目录,描述了程序集本身的信息,例如程序集标识(名称,版本,文化),程序集包含的资源(Resources),组成程序集的文件等:

 

清单之后就是源数据.如果说清单描述了程序集自身的信息,那么元数据则描述了程序集所包含的内容.这些内容包含:程序集包含的模块,类型,类型的成员,类型和类型成员的可见性等.注意,元数据并不包含类型 的实现,有点类似于C++中的.h头文件..NET,查看元数据的过程就叫做反射(Reflection):

 

接下来就是已经转换为CIL的程序代码了,也就是元数据中类型的实现,包含方法体,字段等,类似于C++中的.cpp文件:

 

从上图中可以看出,程序集是自解释型的,不再需要任何额外的东西,例如注册表,就可以完整的知道程序集的一切信息.

 

中说简单的说完程序集了,下面还有程序集是如何被执行的...我发誓这是最后一点无聊的东西,过去了咱们就开始学新的东西了,比如文件啊,序列化啊.

 

 

运行程序集

 

现在已经了解过程序集,并且知道程序集中包含的CIL代码不能直接运行,还需要CLR的支持.概括来说,CLR是一个软件层或代理,它管理了.NET程序集的执行,主要包括:管理应用程序集,加载和运行程序集,安全检查,CIL代码即时编译为机器代码,异常处理,对象析构和垃圾回收.相对于编译时(Compile time),这些过程发生在程序运行的过程中,因此,将这个软件层命名为了运行时,实际上它本身与事件时没有什么太大关系.一些朋友在初学.NET的时候,纠结在Runtime这个词上,总以为和时间有关,总是不能很好的理解CLR.你只要知道他是干什么的就行,他的名字无所谓.

 

实际上,CLR还有一种叫法,VES(虚拟执行系统).从上一段的说明来看,这个命名应该更能描述CLR的作用,也不容易引起混淆,但是可能为了和CIL,CTS,CLS等术语保持一致,最后将其命名为了CLR.在这里,我们知道CLR不过是一个.NET程序集的运行环境而已,有点类似于Java虚拟机.VES这个术语来自于CLI.

 

CLR的主要作用:

 

 

CLR以什么样的形式位于什么位置?

 

由于CLR本身用于管理托管代码,因此它是由非托管代码编写的,并不是一个包含了托管代码的程序集,也不能使用IL DASM进行查看.

 

接下来再看一下CLR是如何运行起来的.虽然从Windows Server 2003开始,.NET框架已经预装在操作系统中,但是它还没有集成为操作系统的一部分.操作系统在尝试打开一个托管程序集(.exe),首先会检查PE,根据PE头来创建合适的进程.

 

最后简单的说一下CLI----公共语言基础

 

CLI是一个国际标准,ECMAISO进行了标准化,全称为Common Language Infrastructure(从公语言基础).他只是一个概念和汇总,实际上本章的每一小节都是这个标准的一部分.CLI包括:CIL,CTS,CLS.VES,源数据,基础框架.

 

为啥CLI.NET框架包含的内容如此雷同?他们之间是什么关系?简单来说,CLI是一个标准,.NET框架是这个标准的具体实现.CLI,并没有CLR的概念,只有VES,CLR就是.NET框架中VES的具体实现.既然CLI只是一个标准,.NET框架是它在windows平台上的具体实现,那么是不是就只有.NET框架这一个CLI的实现?显然不是,Mono Project就是CLI标准的另一个实现.Mono Project的目标就是将.NET框架多平台化,使其可以运行在各种平台上,包括Mac OS,Linux.

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值