第一章: Microsoft .NET框架开 .NET框架开 发平台体系结构
1.1将源代码编译为托管模块 1.1将源代码编译为托管模块
编译器和工具公开运行库的功能并使程序 员能够编写受益于此托管执行环境的代码。 使用针对运行库的语言编译器开发的代码 称为托管代码; 使用托管代码有很多好处,因为它具有诸 多功能,如跨语言集成、跨语言异常处理、 增强的安全性、版本控制和部署支持、简 化的组件交互模型、调试和分析服务等。
CLR的存在使得我们可以选择适合表达逻辑 CLR的存在使得我们可以选择适合表达逻辑 的语言,只要存在相应得编译器将代码编 译成为面向CLR的代码即可,结果成为托管 译成为面向CLR的代码即可,结果成为托管 模块。
编译器:语法检查器和“正确代码分析器” 编译器:语法检查器和“正确代码分析器” 托管模块(managed module):需要CLR才 托管模块(managed module):需要CLR才 能执行的标准Microsoft Windows可移植执行 能执行的标准Microsoft Windows可移植执行 (portable executable简称PE)文件。 executable简称PE)文件。
注意: 早期编译器产生面向CPU的机器语言,直接 早期编译器产生面向CPU的机器语言,直接 运行。 CLR的IL是过渡机器语言,运行需CLR支持, CLR的IL是过渡机器语言,运行需CLR支持, 也就是说托管应用程序只能运行在安装 了.net框架的计算机上。这也是.net平台的特 .net框架的
计算机上。这也是.net平台的特 点。
PE表头:指出文件类型,文件的时间标记 PE表头:指出文件类型,文件的时间标记 CLR表头:CLR版本,托管模块入口、元数 CLR表头:CLR版本,托管模块入口、元数 据、资源、强命名、标记等信息 元数据(metadata)(表):
源代码中定义、 元数据(metadata)(表):源代码中定义、 引用的类型和成员 中间语言(IL)代码Intermediate 中间语言(IL)代码Intermediate language 托管代码(managed code) 托管代码(managed code)
关于元数据:
总与IL代码同步 总与IL代码同步 省去源代码编译时对头文件和库文件的需求 Visual Studio .NET利用之进行智能感知,辅助 .NET利用之进行智能感知,辅助 编码 用于CLR的代码验证 用于CLR的代码验证 序列化及反序列化对象 垃圾收集器可以追踪对象的生存期
1.2将托管模块组合为程序集 1.2将托管模块组合为程序集
CLR实际上并不和托管模块打交道,它 CLR实际上并不和托管模块打交道,它 直接打交道的对象是程序(assembly) 直接打交道的对象是程序(assembly). 程序集是一个抽象的概念,刚开始往往 很难理解。首先,程序集是一个或多个 托管模块,以及一些资源文件的逻辑组 合。 其次,程序集
是组件复用,以及实施安 全策略和版本的最小单位。根据我们对 编译器和相关工具所做的选择,程序集 可以是一个文件或者多个文件。
默认情况下,编译器会将产生的托管模块转换为 一个程序集。也就是说,visual basic编译器产生的 一个程序集。也就是说,visual basic编译器产生的 是一个包含了清单(manifest)的托管模块。其中 是一个包含了清单(manifest)的托管模块。其中 的清单表明程序集中仅包含一个文件。对于仅包 含一个托管模块,并且没有资源(或者数据)文 件的项目来说,程序集就是托管模块,而且在创 件的项目来说,程序集就是托管模块,而且在创 建过程中,不需要执行任何其他的步骤。
程序集中的模块还包含它所引用的程序集的一些 信息(如版本号信息)。这些信息使得一个程序 集得以实现自描述(self-describing)。换句话说, 集得以实现自描述(self-describing)。换句话说, CLR知道执行一个程序集所需要的所有内容,它 CLR知道执行一个程序集所需要的所有内容,它 不需要再在注册表或者活动目录中获取额