CLR via C# 笔记 (CLR基础) (更新中)

15 阅读2分钟

第一章 CLR的执行模型

CLR的定义:公共语言运行时(Common Language Runtime, CLR), 可以由多种编程语言使用的“运行时”。 microsoft 创建了好几个面向运行时的语言编译器。包括C++ C# IL (常用语言)。最后的编译结果都是托管模块。

托管模块:标准的32位microsoft windows可移植执行体(PE32)文件,或者是标准的64位 windows可移植执行(PE32+). 这些都需要CLR才能执行。

  • 组成部分包括:PE32或PE32+头,CLR头,元数据和IL代码。其中CLR头包含托管模块相关的信息,包含CLR版本,一些flag,模块入口方法(Main)的methodDef元数据token一集模块的元数据。元数据中包括源代码中定义的类型和成员,以及饮用的类型和成员。

面向CLR的编译器特性:

  • native code compiler生成的是面向特定cpu架构的代码。而CLR生成的是IL代码(托管代码).
  • 会在每个托管模块中生成完整的元数据。 描述模块中定义了什么以及引用了什么。
  • 元数据的作用:避免了编译时对C/C++头和库文件的依赖。 intellisense通过元数据起作用。确保代码之执行类型安全的操作。允许对象字段的序列化和反序列化(C#层面几乎无感)。 允许gc跟踪对象生存期
  • 总是生成包含IL和托管数据(可进行垃圾回收的数据类型)的模块。

程序集:

  • 定义:是一个或多个模块/资源文件的逻辑性分组,是重用,安全性以及版本控制的最小单位。
  • 可以将一组文件作为单独的实体来对待
  • PE(32+)中的manifest包括了构成程序集的文件,程序集中公开导出的类型(public class)以及与程序集关联的资源或数据文件
  • 还包含与引用的程序集有关的信息(包括版本号)。
  • 既可以是dll也可以是可执行应用程序

CLR是如何加载的: