生成、打包、部署和管理应用程序及类型(上)

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

猜你喜欢

转载自www.cnblogs.com/lzcgis/p/10251697.html