1 生成、打包、部署和管理应用程序及类型
1.1 .net framework 部署目标
Windows一直不稳定和过于复杂(其实也很封闭,逐渐开放,如core),微软认为主要原因是:
(1)应用程序来自微软或其他厂商的dll,多个厂商的代码带来复杂性。安装新程序会破坏原有程序,带来dll hell。
(2)安装复杂性。大多数应用安装的时候会影响到系统的全部组件。
(3)安全性。安装程序会带来各种文件,许多不同公司开发的。
1.2 将类型生成到模块中
响应文件包含一组编译器命令开光的文件,执行csc.exe时,编译器打开响应文件,并使用其中包含的所有开关。
1.3 元素据概述
元素据是由几个表构成的二进制数据块,分别是定义表、引用表、清单表。
模块元素据常用定义表如下:
元素据定义表名称 |
说明 |
Moduledef |
总是包含对模块进行标识的一个记录项,该记录项包含模块文件名、拓展名、模块版本ID |
Typedef |
模块定义的每个类型在这个表中都有一个记录项,包含类型名、基类型、标志(public、private)、索引,索引指向Moduledef表中该类型的方法、fielddef表中该类型的字段、propertydef表中该类型的属性以及eventdef表中该类型的事件 |
Methoddef |
模块定义的每个方法在这个表中都有一个记录项,包含方法的名称、标志(private、public、virtual、abstract,static、final)签名、方法的IL代码在模块的偏移量。还引用了paramdef表中的一个记录项,包括与方法参数有关的更多信息。 |
Fielddef |
模块定义的每个字段在这个表中都有一个记录项,每个记录项都包含标志(private、public)、类型和名称 |
paramdef |
模块定义的每个参数在这个表中都有一个记录项,包含标志(in、out、retval)、类型和名称 |
Propertydef |
模块定义的每个属性在这个表中都有一个记录项,包含标志、类型和名称 |
Eventdef |
模块定义的每个事件在这个表中都有一个记录项,包含标志和名称 |
编译器还会检测源代码引用的类型、方法、字段、属性、事件,并创建相应的元素据表记录项。在创建的元素据中包含一组引用表,记录了所引用的内容,常用的引用元数据表如下:
引用元素据表名称 |
说明 |
Assemblyref |
模块引用的每个程序集在这个表中都有一个记录项。包含绑定该程序集所需的信息:程序集名称、版本号、语言文化、公钥token。还包含一些标志(flag)和一个哈希值(忽略)。 |
Moduleref |
实现该模块所引用的类型的每个PE模块在这个表中都有一个记录项,包含模块的文件名和拓展名。可能是别的模块实现了需要的类型,这个表的作用便是建立同那些类型的绑定关系。 |
typeref |
模块引用的每个类型在这个表中都有一个记录项。记录项包含类型的名称和一个引用(指向位置)。 |
memberref |
模块引用的成员(字段方法、属性方法、事件方法)在这个表中都有一个记录项,包含成员的名称和签名,并指向对成员进行定义的那个类型的typeref记录项。 |
ILDasm.exe是检查托管PE的常用工具,通过命令 ILDasm program.exe