1.1将源代码编译成托管模块
.NET Framework 在某种程度上,它是它自己的操作系统:有自己的内存管理器、安全系统、文件加载器、错误处理机制、应用程序隔离边界(AppDomains)、线程处理模型等。
公共语言运行时 (Common Language Rumtime,CLR)的核心功能(比如内存管理、程序集加载、安全性、异常处理和线程同步)可由面向CLR的所有语言使用。例如,CLR允许创建线程,所以面向CLR的任何语言都能创建线程。可用任何编程语言进行开发,只要编译器是面向CLR的就可以了,例如Microsoft创建的几个语言编译器:C++/CLI、C#、Visual Basic、F#、Iron Python、Iron Ruby以及一个"中间语言"(Intermediate Language,IL)汇编器。
编译源代码的过程如下:
托管模块 是以一个标准的32位 Windows可移植执行体(PE32)或者64位的Windows可移植执行体(PE32+)文件,它们都需要CLR才能执行.托管的程序集总是利用Windows的数据执行保护(Data Execution Prevention ,DEP)和地址空间布局随机化(Address Space Layout Randomization,ASLR)来增强整个系统的安全性.
托管模块的各个部分:
1. PE32或PE32+ 头: 分辨是在32位还是64位系统上运行,标识文件类型包括GUI、CUI或者DLL
2. CLR头: CLR版本,托管模块入口方法的MethodDef元数据token,资源,强名称,一些flag
3. 元数据: 主要的两种类型的表:分别是描述源代码中定义、引用的类型和成员。
4. IL(中间语言)代码:编译器编译源代码时生成的代码,CLR将IL编译成本地CPU指令。
元数据 是一组数据表:
1. 描述了模块中定义的内容,比如类型及其成员
2. 描述了托管模块引用的内容,比如导入的类型及其成员
3. 清单manifest,描述了构成Assembly的文件,由Assembly中的文件实现的公共导出类型,与Assembly相关联的资源/数据文件
元数据总是与包含IL代码的文件关联同步的,总是嵌入和代码相同的EXE/DLL文件中。
元数据的用途:
1. 编译时,消除了对本地头和库文件的需求,编译器可直接从托管模块读取元数据
2. Visual Studio使用元数据,它的”智能感知”技术解析元数据
3. CLR的代码验证使用元数据确保代码只执行”类型安全”的操作
4. 允许将对象的字段序列化到内存块,发送到别的极其,通过反序列化,重建对象的状态
5. 垃圾收集器跟踪对象的生存期及那些字段引用了其他对象
Microsoft的C#,Visual Basic,F#和IL汇编器生成包含托管代码(IL)和托管数据的模块,这些模块需要用户安装CLR(.NET Framework的一部分提供).而C++编译器默认生成包含非托管(本地)代码的EXE/DLL模块,并在运行时操纵非托管数据(本地内存),这些模块不需要CLR就可执行.而C++也可以通过/CLR命令行开关,生成托管代码模块.