《.NET探秘MSIL权威指南》是IL汇编语言的权威之作,深入地讲解了IL的全部内容,是.NET底层开发人员必备的参考书,对于从概念设计到实现和维护等软件开发所有阶段都很有价值。《.NET探秘MSIL权威指南》内容基于.NET 2.0版本,同时,考虑到.NET 3.0/3.5在CLR/IL上没有作任何改动,且即将推出的 .NET 4.0也只是在CLR上稍作修改而并没有涉及IL语言,所以,《.NET探秘MSIL权威指南》对于目前各个版本的.NET Framework而言都是适用的。
《.NET探秘MSIL权威指南》适合所有.NET开发人员、讲师、研究人员阅读。
目录
- 第一部分 快速入门
- 第1章 简单示例 2
- 1.1 CLR基础 2
- 1.2 简单示例:The Code 5
- 1.2.1 程序头 7
- 1.2.2 类声明 8
- 1.2.3 字段声明 9
- 1.2.4 方法声明 10
- 1.2.5 全局项 14
- 1.2.6 映射字段 16
- 1.2.7 数据声明 16
- 1.2.8 作为占位符的值类型 17
- 1.2.9 调用非托管代码 17
- 1.3 类的预先声明 18
- 1.4 小结 20
- 第2章 代码增强 21
- 2.1 精简代码 21
- 2.2 保护代码 23
- 2.3 小结 28
- 第3章 使代码更简单 29
- 3.1 别名 29
- 3.2 编译控制伪指令 31
- 3.3 关联当前类及其引用项 34
- 3.4 小结 35
- 第二部分 底层结构
- 第4章 托管可执行文件的结构 38
- 4.1 PE/COFF头 39
- 4.1.1 MS-DOS头/Stub和PE签名 40
- 4.1.2 COFF头 40
- 4.1.3 PE头 43
- 4.1.4 节头 47
- 4.2 CLR头 49
- 4.2.1 头结构 50
- 4.2.2 Flags字段 51
- 4.2.3 EntryPointToken字段 52
- 4.2.4 VTableFixups字段 52
- 4.2.5 StrongNameSignature字段 53
- 4.2.6 重定位节 53
- 4.2.7 文本节 55
- 4.2.8 数据节 56
- 4.2.9 数据常量 56
- 4.2.10 V表 57
- 4.2.11 非托管导出表 57
- 4.2.12 线程局部存储(TLS) 59
- 4.2.13 资源 60
- 4.2.14 非托管资源 60
- 4.2.15 托管资源 62
- 4.3 小结 63
- 4.3.1 第一阶段:初始化 63
- 4.3.2 第二阶段:源代码解析 63
- 4.3.3 第三阶段:映像生成 63
- 4.3.4 第四阶段:完成 64
- 第5章 元数据表的组织 65
- 5.1 什么是元数据 65
- 5.2 堆和表 67
- 5.2.1 堆 67
- 5.2.2 通用元数据头 68
- 5.2.3 元数据表流 70
- 5.3 RID和标记 73
- 5.3.1 RID 73
- 5.3.2 标记 73
- 5.3.3 编码标记 75
- 5.4 元数据有效性检查 78
- 5.5 小结 79
- 第三部分 基本组件
- 第6章 模块和程序集 82
- 6.1 什么是程序集 82
- 6.2 私有程序集和共享程序集 82
- 6.3 作为逻辑执行单元的应用程序域 83
- 6.4 清单 84
- 6.5 Assembly元数据表和声明 86
- 6.6 AssemblyRef元数据表和声明 87
- 6.7 加载程序搜索程序集 89
- 6.8 Module元数据表和声明 92
- 6.9 ModuleRef元数据表和声明 92
- 6.10 File元数据表和声明 93
- 6.11 托管资源元数据表和声明 94
- 6.12 ExportedType元数据表和声明 97
- 6.13 ILAsm中清单声明的次序 98
- 6.14 单模块程序集和多模块程序集 99
- 6.15 元数据有效性规则概要 100
- 6.15.1 Assembly表有效性规则 100
- 6.15.2 AssemblyRef表有效性规则 100
- 6.15.3 Module表有效性规则 101
- 6.15.4 ModuleRef表有效性规则 101
- 6.15.5 File表有效性规则 101
- 6.15.6 ManifestResource表有效性规则 101
- 6.15.7 ExportedType表有效性规则 102
- 第7章 命名空间和类 103
- 7.1 类的元数据 104
- 7.1.1 TypeDef元数据表 105
- 7.1.2 TypeRef元数据表 106
- 7.1.3 InterfaceImpt元数据表 106
- 7.1.4 NestedClass元数据表 106
- 7.1.5 ClassLayout元数据表 107
- 7.2 命名空间和类的完整名称 107
- 7.2.1 ILAsm命名约定 108
- 7.2.2 命名空间 109
- 7.2.3 类的完整名称 110
- 7.3 类的特性 111
- 7.3.1 标志 111
- 7.3.2 类的可见性和友元程序集 113
- 7.3.3 类的引用 113
- 7.3.4 父类型 114
- 7.3.5 接口实现 114
- 7.3.6 类的布局信息 115
- 7.4 接口 115
- 7.5 值类型 117
- 7.5.1 值的装箱和拆箱 117
- 7.5.2 值类型的实例成员 118
- 7.5.3 值类型的派生 118
- 7.6 枚举 119
- 7.7 委托 119
- 7.8 嵌套类型 121
- 7.9 类的扩充 123
- 7.10 元数据有效性规则概要 125
- 7.10.1 TypeDef表有效性规则 125
- 7.10.2 特定于枚举的有效性规则 126
- 7.10.3 TypeRef表有效性规则 126
- 7.10.4 InterfaceImpt表有效性规则 126
- 7.10.5 NestedClass表有效性规则 127
- 7.10.6 ClassLayout表有效性规则 127
- 第8章 基本类型和签名 128
- 8.1 CLR中的基本类型 128
- 8.1.1 基本数据类型 128
- 8.1.2 数据指针类型 129
- 8.1.3 函数指针类型 131
- 8.1.4 向量和数组 131
- 8.1.5 修饰符 133
- 8.1.6 本地类型 134
- 8.1.7 可变类型 136
- 8.2 签名中类的表示 138
- 8.3 签名 139
- 8.3.1 调用约定 139
- 8.3.2 字段签名 139
- 8.3.3 方法和属性签名 140
- 8.3.4 MemberRef签名 140
- 8.3.5 间接调用签名 141
- 8.3.6 局部变量签名 141
- 8.3.7 类型说明 142
- 8.4 签名有效性规则概要 143
- 第9章 字段和数据常量 144
- 9.1 字段元数据 144
- 9.1.1 定义字段 145
- 9.1.2 引用字段 146
- 9.2 实例字段和静态字段 147
- 9.3 默认值 147
- 9.4 映射字段 150
- 9.5 数据常量声明 151
- 9.6 显式布局和联合声明 152
- 9.7 全局字段 155
- 9.8 构造函数与数据常量 156
- 9.9 元数据有效性规则概要 158
- 9.9.1 Field表有效性规则 159
- 9.9.2 FieldLayout表有效性规则 159
- 9.9.3 FieldRVA表有效性规则 159
- 9.9.4 FieldMarshal表有效性规则 160
- 9.9.5 Constant表有效性规则 160
- 9.9.6 MemberRef表有效性规则 160
- 第10章 方法 161
- 10.1 方法元数据 161
- 10.1.1 Method表的记录字段 162
- 10.1.2 方法标志 162
- 10.1.3 方法名称 164
- 10.1.4 方法实现标志 165
- 10.1.5 方法参数 166
- 10.1.6 引用方法 167
- 10.1.7 方法实现元数据 168
- 10.2 静态方法、实例方法和虚方法 168
- 10.3 显式方法重写 172
- 10.4 方法重写和可访问性 177
- 10.5 方法头特性 178
- 10.6 局部变量 180
- 10.7 类的构造函数 181
- 10.7.1 类的构造函数和beforefieldinit标志 182
- 10.7.2 模块构造函数 184
- 10.8 实例构造函数 184
- 10.9 实例终结器 186
- 10.10 可变参数列表 187
- 10.11 方法重载 189
- 10.12 全局方法 191
- 10.13 元数据有效性规则概要 191
- 10.13.1 Method表有效性规则 192
- 10.13.2 Param表有效性规则 193
- 10.13.3 MethodImpl表有效性规则 193
- 第11章 泛型类型 195
- 11.1 泛型类型元数据 196
- 11.1.1 GenericParam元数据表 198
- 11.1.2 GenericParamConstraint元数据表 198
- 11.1.3 TypeSpec元数据表 199
- 11.2 约束标志 199
- 11.3 在ILAsm中定义泛型类型 199
- 11.4 类型参数寻址 200
- 11.5 泛型类型实例化 201
- 11.6 定义泛型类型:继承、实现、约束 202
- 11.7 定义泛型类型:循环依赖 203
- 11.8 泛型类型的成员 205
- 11.9 嵌套泛型类型 210
- 11.10 元数据有效性规则概要 213
- 第12章 泛型方法 214
- 12.1 泛型方法元数据 214
- 12.2 泛型方法签名 216
- 12.3 在ILAsm中定义泛型方法 216
- 12.4 调用泛型方法 217
- 12.5 重写虚泛型方法 219
- 12.6 元数据有效性规则概要 223
- 第四部分 深入执行引擎
- 第13章 IL指令 226
- 13.1 长参数和短参数指令 227
- 13.2 标号和流程控制指令 227
- 13.2.1 无条件转移指令 228
- 13.2.2 有条件转移指令 228
- 13.2.3 比较转移指令 228
- 13.2.4 switch指令 230
- 13.2.5 break指令 230
- 13.2.6 托管EH块退出指令 230
- 13.2.7 托管EH块结束指令 231
- 13.2.8 ret指令 231
- 13.3 运算指令 231
- 13.3.1 栈处理 231
- 13.3.2 常量加载 232
- 13.3.3 间接加载 233
- 13.3.4 间接存储 233
- 13.3.5 算术操作 234
- 13.3.6 溢出算术操作 235
- 13.3.7 位操作 236
- 13.3.8 移位操作 236
- 13.3.9 转换操作 237
- 13.3.10 溢出转换操作 238
- 13.3.11 逻辑条件检查指令 238
- 13.3.12 块操作 239
- 13.4 寻址参数和局部变量 239
- 13.4.1 方法参数加载 239
- 13.4.2 方法参数地址加载 240
- 13.4.3 方法参数存储 240
- 13.4.4 方法参数列表 240
- 13.4.5 局部变量加载 240
- 13.4.6 局部变量引用加载 241
- 13.4.7 局部变量存储 241
- 13.4.8 局部块分配 241
- 13.4.9 前缀指令 241
- 13.5 寻址字段 242
- 13.6 调用方法 243
- 13.6.1 直接调用 243
- 13.6.2 间接调用 244
- 13.6.3 尾部调用 245
- 13.6.4 带约束的虚调用 246
- 13.7 寻址类和值类型 247
- 13.8 向量指令 250
- 13.8.1 向量创建 250
- 13.8.2 元素地址加载 251
- 13.8.3 元素加载 251
- 13.8.4 元素存储 252
- 13.9 代码可验证性 252
- 第14章 托管异常处理 255
- 14.1 EH子句的内部表示 255
- 14.2 EH子句的类型 256
- 14.3 EH子句声明的标号格式 258
- 14.4 EH子句声明的作用域格式 259
- 14.5 处理异常 262
- 14.6 异常类型 264
- 14.6.1 加载程序异常 264
- 14.6.2 JIT编译器异常 264
- 14.6.3 执行引擎异常 265
- 14.6.4 互操作异常 266
- 14.6.5 子类异常 266
- 14.6.6 非托管异常映射 266
- 14.7 EH子句结构化规则概要 267
- 第五部分 特殊组件
- 第15章 事件和属性 270
- 15.1 事件和委托 270
- 15.2 事件元数据 273
- 15.2.1 Event表 273
- 15.2.2 EventMap表 274
- 15.2.3 MethodSemantics表 274
- 15.3 事件声明 275
- 15.4 属性元数据 277
- 15.4.1 Property表 278
- 15.4.2 PropertyMap表 279
- 15.5 属性声明 279
- 15.6 元数据有效性规则概要 280
- 15.6.1 Event表有效性规则 280
- 15.6.2 EventMap表有效性规则 281
- 15.6.3 Property表有效性规则 281
- 15.6.4 PropertyMap表有效性规则 281
- 15.6.5 MethodSemantics表有效性规则 281
- 第16章 自定义特性 283
- 16.1 自定义特性的概念 283
- 16.2 CustomAttribute元数据表 284
- 16.3 自定义特性的值编码 285
- 16.4 自定义特性的逐字描述 287
- 16.5 自定义特性声明 288
- 16.6 自定义特性的分类 291
- 16.6.1 执行引擎和JIT编译器 292
- 16.6.2 互操作子系统 293
- 16.6.3 安全 295
- 16.6.4 Remoting子系统 296
- 16.6.5 Visual Studio调试器 297
- 16.6.6 程序集链接器 297
- 16.6.7 公共语言规范(CLS)兼容性 298
- 16.6.8 伪自定义特性 298
- 16.7 元数据有效性规则概要 300
- 第17章 安全特性 301
- 17.1 声明性安全 301
- 17.2 声明性操作 302
- 17.3 安全许可权限 303
- 17.3.1 访问许可权限 303
- 17.3.2 身份许可权限 306
- 17.3.3 自定义许可权限 308
- 17.3.4 许可权限集 309
- 17.4 声明性安全元数据 310
- 17.5 许可权限集的Blob编码 311
- 17.6 安全特性声明 311
- 17.7 元数据有效性规则概要 312
- 第18章 托管代码和非托管代码的互操作 314
- 18.1 Thunk和包装器 315
- 18.1.1 P/Invoke Thunk 315
- 18.1.2 实现映射元数据 317
- 18.1.3 IJW Thunk 317
- 18.1.4 COM可调用包装器 318
- 18.1.5 运行时可调用包装器 319
- 18.2 数据封送 320
- 18.2.1 blittable类型 320
- 18.2.2 in/out参数 321
- 18.2.3 字符串封送 322
- 18.2.4 对象封送 323
- 18.2.5 更多对象封送 324
- 18.2.6 数组封送 325
- 18.2.7 委托封送 325
- 18.3 为非托管代码提供托管方法作为回调 326
- 18.4 作为非托管导出的托管方法 328
- 18.5 小结 334
- 第19章 多语言工程 336
- 19.1 IL反汇编器 336
- 19.2 双向解析的原则 340
- 19.3 创造性的双向解析 341
- 19.4 使用类的扩充 342
- 19.5 通过双向解析进行模块链接 342
- 19.6 ASMMETA:解决循环依赖 344
- 19.7 内嵌在高级语言中的IL 346
- 19.8 在调试模式下编译 347
- 19.9 小结 352
- 第六部分 附录
- 附录A ILAsm语法 356
- 附录B 元数据表 376
- 附录C IL指令集 387
- 附录D IL汇编器和IL反汇编器的命令行选项 394
- 附录E 离线验证工具 399
- 部分术语翻译说明 416