内容提要
本章的目的是对.Net 框架的设计作一个整体的介绍,包括介绍框架中使用的一些技术、定义一些术语。同时会展现从源代码生成应用程序(或者一些包含了一些自定义类型的能够发布的组件),而且会解释程序的运行机制。 编程
包含如下子标题: windows
- 将源代码编译成托管的模块(Managed Modules)
- 将Managed Modules 组合成 Assemblie
- 加载 CLR
- 执行 Assembly 代码
- Native code 生成工具:NGen.exe
- .NET 框架类库 (Framework Class Library, FCL)
- The Common Type System (CTS)
- The Common Language Specification (CTS)
- 与非托管代码的互操做性
将源代码编译成托管模块(Managed Modules)
CLR是能够被不一样的编程语言共同使用的运行时环境。实际上,在运行时,CLR并不知道程序是使用什么语言写的,由于这些语言都被预先编译成了Managed Module (IL 和 元数据)。不一样语言的编译器,能够认为是不一样的代码检查器,检查代码的语法是否正确,描述的操做是否合理等。 安全
本地代码产生针对CPU的代码,而C#、F#等语言产生的是针对CLR的代码。 框架
除了产生IL代码以外,全部针对CLR的编译器还会在每一个托管模块中生成"元数据"(metadata)。简要来讲,Metadata是用来描述module中定义了什么东西(例如类型以及类型的成员)的一组数据表。另外,Metadata还描述了Module中引用了哪些东西(好比外部载入的类型以及类型的成员) 编程语言
PE32 or PE32+ header工具 |
- 若是模块中含有native code,则会有 PE32(+) 信息,不然(即只包含托管代码)这部分会被忽略掉
- PE32 for 32bit windows ,while PE32+ for 64bit
- indicates the type of file : GUI/CUI/DLL
- contains a time stamp indicating when the file was built
|
CLR headerui |
- 包含使得该托管模块因此为托管模块的信息
- 指定所须要的CLR 的版本、一些flags
- the MethodDef metadata token of the managed module's entry point method
- 模块中元数据、资源、strong name 、some flags 等的位置和大小
|
元数据(Metadata)设计 |
- 全部托管模块都包含元数据表,共分两类:
- 描述代码中定义的类型和成员的表
- 源代码中引用了的类型和成员的表
|
IL代码code |
- 源代码编译以后生成的代码
- CLR负责在运行时将其编译成本地cpu指令
|
Metadata有不少用途,例如: 对象
- 有了Metadata就不须要像C/C++头文件以及库文件的东西了,由于Metadata将引用模块所须要的信息存储在模块自身当中了,编译器能够从模块中之间提取这部分信息;
- Visual Studio中的智能输入提示也是经过处理Metadata中所包含的信息来帮助写代码的;
- CLR的代码验证过程使用Metadata来确保只进行了类型安全的操做;
- 实现序列化
- 是的垃圾回收器能够肯定对象的生命周期,对任意对象,gc能够经过metadata知道这个对象的类型以及这个对象引用了哪些其余对象;
C#/F#/ILAsm 都是产生托管的代码和托管的类型。而Microsoft C++则默认产生native code,可是能够经过/clr 使其产生托管的module。Microsoft C++仍是惟一一个能够容许开发这既使用托管代码又使用非托管代码而且将两者注入到同一个module中的编译器,因此常被利用来在托管项目中调用已有的非托管代码。
将Managed Modules 组合成 Assemblie
加载 CLR
执行 Assembly 代码
Native code 生成工具:NGen.exe
.NET 框架类库 (Framework Class Library, FCL)
The Common Type System (CTS)
The Common Language Specification (CTS)
与非托管代码的互操做性