C#学习笔记-托管模块

1. 将源代码编译成托管模块

CLR(Common Language Runtime): 公共语言运行时,一个可由多种编程语言使用的运行时环境。
CLR核心功能: 内存管理、程序集加载、安全性、异常处理、线程同步......
CLR语言编译的结果: 托管模块
托管模块:在Windows下是标准的32位Microsoft Windows可移植执行体(Portable Executable 32, PE32)文件,或64位可移植执行体(PE32+),它们都需要CLR才能执行。且托管程序集总是利用Windows的数据执行保护(Data Execution Prevention, DEP)和地址空间布局随机化(Address Space Layout Randomization, ASLR)这2个功能来增强整个系统的安全性。

  Native Code Compilers编译生成的都是面向特定CPU架构(如x86,x64,ARM)的代码,但是面向CLR的编译器生成的都是IL(中间语言)代码,IL代码也称为托管代码,因为CLR会管理它的执行。

  元数据总是与包含IL代码的文件关联,编译器同时生成元数据和IL代码,把两者绑定在一起并嵌入到最终生成的托管模块中,所以元数据和它描述的IL代码是同步的。元数据的其他作用列举:

  • CLR代码验证过程使用元数据信息来确保代码只执行”类型安全“的操作
  • 元数据允许将对象的字段序列化到内存,将其发送给另一台机器,然后反序列化,在远程机器上重建对象状态。
  • 元数据允许垃圾回收期跟踪对象的生命周期。

2. 将托管模块合并成程序集

CLR实际不和模块工作,它和程序集工作。程序集是一个或多个模块/资源文件的逻辑性分组,是重用、安全性及版本控制的最小单元。CLR中程序集相当于组件。

 图中托管模块和资源文件经过工具生成一个代表文件逻辑分组的PE32(+)文件,这个文件包含一个名为清单的数据块。清单也是元数据表的集合,这些表描述了构成程序集的文件、程序集中的文件实现的公开的public类型以及程序集关联的资源或数据文件。

3. 加载CLR

  生成的程序集可以是可执行运用程序也可以是DLL,最终都是由CLR管理程序集代码的执行,这意味着目标机器必须安装.Net Framework。如果程序集只包含类型安全的托管代码,则代码在32位和64位Windows上都能正常工作。C#编译器提供了/platform命令行开关,这个开关允许指定生成的程序集的目标平台,不指定的话默认就是anycpu,表明可以在任何版本的Windows上运行。只有极少数情况下才会指定目标平台,例如使用了不安全代码或者需要和某种面向特定CPU的非托管代码进行互操作(如调用C++的32/64位dll)。在Visual Studio中如果需要设置目标平台,可以打开项目的属性页,从“生成”-“目标平台”中选择:

 

 4. 执行程序集代码

  托管程序集同时包含元数据和IL代码,IL是与CPU无关的机器语言。为了执行方法首先必须把方法的IL转换成本机(Native)CPU指令,这个工作由CLR的JIT(just-in-time,即时)编译器来完成。下图为一个类的static方法首次调用时的过程:

原文地址:https://www.cnblogs.com/djh5520/p/14285707.html