.NET 程序集
一、程序集的功能
1、程序集包含公共语言运行库执行的代码(如果可移植可执行PE文件没有管理程序集清单,则将不执行该文件中的MSIL代码。每个程序集只能有一个入口,即DllMain、WinMain或Main);
2、程序集形成安全边界,程序集是.NET代码请求和授权的单元;
3、程序集形成类型边界;
4、程序集形成引用范围边界,程序集的清单包含用于解析类型和满足资源请求的程序集元数据,它指定在该程序集之外公开的类型和资源。该清单还枚举它所依赖的其他程序集。
5、程序集形式版本边界;
6、程序集形成部署单元;
7、程序集是支持并行执行的单元。
二、程序集内容
1、程序集清单,包含程序集元数据
----程序集清单的内容----
程序集名称:程序集的名称
版本号:主版本号和次版本号,以及修订号和内部版本号
区域性:有关该程序集支持区域性或语言的信息
强名称信息:如果已经为程序集提供了一个强名称,则该信息来自发行者公钥
程序集中所有文件的列表:在程序集中包含的每一个文件的散列和文件名
类型引用信息:运行库用来将类型引用映射到包含其声明和实现的文件的信息
有关被引用程序集的信息:该程序集静态引用的其他程序集的列表。如果依赖的程序集具有强名称,则每一个引用均包括该依赖程序集的名称、程序集元数据(版本、区域性、操作系统等)和公钥
一组可选的由程序集要求或拒绝的安全权限
附属程序集针对的文化
2、类型元数据;
3、实现类型的MSIL代码;
4、资源集。
三、使用 Ildasm.exe 命令
命令格式:ildasm [options] [PEfilename] [options]
可用于 .exe、.dll、.obj 和 .lib 文件的选项
选项 | 说明 |
---|
/out=filename | 将结果输出到指定文件 |
/text | 将结果输出到控制台 |
/html | 以 HTML 格式输出(仅在与 /out 选项一起使用时有效) |
/rtf | 以多格式文本输出(仅在与 /text 选项一起使用时有效) |
/? | 显示帮助 |
可用于 GUI 或文件/控制台输出的选项(仅限于.exe 和 .dll 文件的选项)
选项 | 说明 |
---|
/bytes | 以十六进制格式显示作为指令注释的实际字节 |
/raweh | 以原始形式显示异常处理子句 |
/tokens | 显示类和成员的元数据标记 |
/source | 将原始源行显示为注释 |
/linenum | 包含对原始源行的引用 |
/visiblility = vis | 仅反汇编具有指定可见性。 |
/pobonly | 仅反汇编公共项 |
/quoteallnames | 将所有名称用单引号括起来 |
/noca | 禁止输出自定义特性 |
/caverbal | 以文字形式输出 CA blob |
/nobar | 禁止反汇编进度栏窗口弹出 |
只对文件/控制台输出有效(用于.exe和.dll 文件)的选项
选项 | 说明 |
---|
/utf8 | 对输出使用 UTF8 编码(默认使用ANSI) |
/unicode | 对输出使用 Unicode 编码 |
/noil | 禁止 IL 汇编程序代码输出 |
/forward | 使用前向类声明 |
/typelist | 输出完整的类型列表 |
/project | 如果输入为.winmd 文件,则显示 .NET 投影视图 |
/header | 将文件头信息包含在输出中 |
/item=<类[::<方法>[(sig)]]> | 只反汇编指定项 |
/stats | 包括图像的统计信息 |
/classlist | 包括在模块中定义的类的列表 |
/all | /header、/bytes、/stats、/classlist 和 /tokens 的组合 |
用于 .exe、.dll、.obj 和 .lib 文件的选项
选项 | 说明 |
---|
/metadata=mdheader | 显示元数据头信息和大小 |
/metadata=hex | 显示以十六进制表示的更多内容以及字 |
/metadata=csv | 显示记录计数和堆大小 |
/metadata=unrex | 显示无法解析的外部对象 |
/metadata=schema | 显示元数据头和架构信息 |
/metadata=raw | 显示原始元数据表 |
/metadata=heaps | 显示原始堆 |
/metadata=validate | 验证元数据的一致性 |
仅用于 .lib 文件的选项:
选项 | 说明 |
---|
/objectfile=<对象文件名> | 显示库中单个对象文件的元数据 |
四、具有强名称的程序集
强名称是由程序集的标识加上公钥和数字签名组成的。其中,程序集的标识包括简单文本名称、版本号和区域性信息(如果提供的话)。
强名称是使用相应的私钥,通过程序集文件(包含程序集清单的文件,并因而也包含构成该程序集的所有文件的名称和散列)生成的。