C# CLR简介
(一)CLR介绍
CLR是一个可以由多编程语言使用的运行时,CLR的核心功能:内存管理,程序集加载,安全性,异常处理,线程同步等等。可以被很多属于微软系列的开发语言使用。
事实上,在运行时,CLR根本不关心开发运用什么语言编写源代码,这意味着选择编程语言的时候,应该选择最容易表达自己意图的语言。只要编译器是面向CLR的即可。
那为毛微软还推出C#,F#,VB等等呢,事实上,可以将编译器视为语法检查器和正确的代码分析器。他们检查源代码,确定你写的一切都有意义,并输出对你意图进行描述的代码,不用编程语言之间可以采用不同的y发来开发。微软帮助我们创建了很多个面向CLR的语言编译器,其中包含:C#,C++,F#等等。以及一个中间语言汇编器。
(二)托管模块
托管模块:其实CLR拿到了我们的源代码,然后用对应的编译器检查和分析代码,结果都是托管模块,不是直接生成程序集的。托管模块是标准的Windows PE可移值的执行体(PE32文件或32+文件)
托管模块的组成部分有:PE32头部分或PE32+头部分,CLR头,元数据,IL中间语言代码。
2.1PE32或PE32+头部分
这个就是我们平时所说的32位程序,或者还是64位程序,就在这里运行的,相信大家都知道vs编译器里面有这个(看下图),其实里面主要就是包含这个东西。其实我们一般的程序选择的平台都是Any CPU,因为我们平时写的程序都是只包含类型安全的托管代码。但是在有些时候,或者要面向一种功能特定的CPU架构的非托管代码互操作的时候。可能就是需要选择其他平台了。
2.2 CLR头
包含使这个模块成为托管模块的信息(可以有CLR和一些使用程序进行介绍),说白了这个就是让我们的CLR能够认识它。
2.3 元数据
每个托管代码都包含元数据表,主要有两种表:一种表描述源代码中定义类和成员,另一种描述代码中引用的类型和成员。
2.4 IL中间语言
编译器编译源代码生成的代码。
(三) 程序集
CLR其实不是和模块工作的,他是和程序集工作的。编译器会将默认生成的托管模块转换为程序集。啥叫程序集呢:简单通俗的讲,程序集就是把IL代码和元数据以及一些资源文件,通过C#编译器,程序集链接器组装而成。生成程序集之后,它有一张清单,告诉我们这个东西有哪些组成。程序集还有一个很重要的地方就是自描述:就是说程序集包含它引用的程序集相关信息,有了这些信息之后呢,CLR可以判断出程序集的直接依赖对象是什么,不需要在注册表里面保存额外的信息。就是因为这个特点,所以程序集部署非常容易。