.NET框架笔记-CLR

  .NET框架的核心便是通用语言运行时(Common Language Runtime,简称CLR)可被各种不同的编程语言所使用的运行时。CLR的很多特性可用于所有面向它的编程语言。比如,如果CLR用异常来报告错误,那么所有面向他的语言都将通过异常来得到错误报告,如果CLR容许我们创建线程,那么所有面向它的语言都可以创建线程。

  实际上,CLR在运行时对开发人员用何种编程语言来完成源代码一无所知。这意味着我们应该选择那些能够容易表达我们意图的编程语言。我们可以用任何自己喜欢的语言来编写代码,前提是我们使用的编译器能够编译面向CLR的代码。

  上图演示了源代码文件的编译过程。如图所示,我们可以用任何支持CLR的编程语言来创建源代码文件。然后用相应的编译器来做语法检查和源代码分析。但是不管使用的是何种编译器,最后生成的结果都是一个托管模块(managed module)。托管模块是一个需要CLR才能执行的标准Windows可移植可执行(portable executable,简称PE)文件。随着时间的推移,其他一些操作系统也有可能采用这种PE文件格式。

                            托管代码组成部分

  PE表头:标准Windows PE文件表头,类似于通用文件格式表头。该表头指出了文件的类型:GUI(图形用户界面),CUI(控制台用户界面),或者DLL。另外该表头还包括一个时间标记永远标识文件创建的时间。对于仅包含IL代码的模块,该表头的大多数信息会被忽略。对于包含有本地CPU代码的模块,该表头还会包含有关本地CPU代码的一些信息。

  CLR表头:包含标识托管的一些信息。这些信息包括托管模块所需要的CLR版本号,一些标记,托管模块入口点方法的MethodDef元数据标记,以及有关托管模块的元数据、资源、强命名、标记和其他一些意义不是太大的信息的位置和尺寸。

  元数据:每个托管模块都包含有一些元数据表。元数据表主要分两种,一种用于描述源代码中定义的类型和成员,一种用于描述源代码中引用的类型和成员

  中间语言IL代码:编译器在编译源代码时产生的指令。CLR在运行时会将IL代码编译成本地CPU命令。由于生成期和执行行为受CLR管理的缘故,IL代码有时也被称作托管代码

  除了产生IL外,所有面向CLR的编译器都需要为托管模块产生完整的元数据,简单的说元数据就是一个数据表的集合,在这些表中,其中一些用于描述托管模块中所定义的内容。元数据是一些早先的技术如类型库、接口定义语言(IDL)文件的一个超集。需要指出的是CLR的元数据远比他们完整。而且不像类型库和IDL,元数据总是和包含IL代码的文件相关联。实际上,元数据总是和这些代码一起被嵌入到同一个EXE/DLL文件中,两者根本不可能分离。因为编译器总是同时产生元数据和IL代码,并且总是同事将他们嵌入到生成的托管模块中,所以元数据和他所描述的IL代码之间总能保持同步。

  元数据有很多用处。下面列出了其中的一些:

  *  元数据省去了源代码编译时对头文件和库文件的需求,这是因为在含有现实类型和成员的IL代码文件中,已经包含了所有被引用的类型和成员的信息。编译器可以直接从托管模块中读取元数据来获得这些信息

  *  Visual Studio .NET可以利用元数据来辅助我们编写代码。它的智能感知特性就是通过分析元数据来告诉我们某个类型提供了哪些方法,以及某个方法有哪些参数。

  *  CLR的代码验证过程可以利用元数据来确保代码仅执行安全操作

  *  利用元数据,我们可以将一个对象的字段序列化到一个内存快中,然后远程传递给另一台机器,最后在远程机器上执行反序列化

  *  利用元数据,垃圾回收机制可以追中对象的生存期。对于任何对象,垃圾回收器都能够通过元数据来确定该对象的类型,并且可以获知该对象的哪些字段引用了其他对象

  

posted @ 2012-09-20 23:55  xiany  阅读(315)  评论(0编辑  收藏  举报