前言
第一部分 快速入门
第1章 简单示例
1.1 公共语言运行环境简介
1.2 开始简单示例
1.2.1 程序头
1.2.2 类声明
1.2.3 字段声明
1.2.4 方法声明
1.2.5 全局项
1.2.6 映射字段
1.2.7 数据声明
1.2.8 作为占位符的值类型
1.2.9 调用非托管代码
1.3 类的提前声明
1.4 小结
第2章 增强代码
2.1 代码维护
2.2 保护代码
2.3 小结
第二部分 底层结构
第3章 托管可执行文件的结构
3.1 PE/COFF头
3.1.1 MS-DOS占位程序和PE特征
3.1.2 COFF头
3.1.3 PE头
3.1.4 区域头
3.2 公共语言运行环境头
3.2.1 头结构
3.2.2 Flags字段
3.2.3 EntryPointToken字段
3.2.4 VTableFixups字段
3.2.5 StrongNameSignature字段
3.3 重定位区域
3.4 正文区域
3.5 数据区域
3.5.1 数据常量
3.5.2 V表
3.5.3 非托管导出表
3.5.4 线程局部存储
3.6 资源
3.6.1 非托管资源
3.6.2 托管资源
3.7 小结
第4章 元数据表组织
4.1 什么是元数据
4.2 堆和表
4.2.1 堆
4.2.2 通用元数据头
4.2.3 元数据表流
4.3 RID和标识
4.3.1 RID
4.3.2 标识
4.3.3 编码标识
4.4 元数据验证
4.5 小结
第三部分 基本组件
第5章 模块和配件
5.1 什么是配件
5.1.1 私有配件和共享配件
5.1.2 作为逻辑执行单元的应用域
5.2 清单
5.2.1 配件元数据表和声明
5.2.2 AssemblyRef元数据表和声明
5.2.3 加载程序搜索配件
5.2.4 Module元数据表和声明
5.2.5 ModuleRef元数据表和声明
5.2.6 Pde元数据表和声明
5.2.7 托管资源元数据和声明
5.2.8 ExpoaedType元数据表和声明
5.3 ILAsm中清单声明的次序
5.4 单模块配件和多模块配件
5.5 元数据验证规则
5.5.1 Assembly表验证规则
5.5.2 AssemblyRef表验证规则
5.5.3 Module表验证规则
5.5.4 ModuleRef表验证规则
5.5.5 File表验证规则
5.5.6 ManifestResouree表验证规则
5.5.7 ExpoaedType表验证规则
第6章 名称空间和类
6.1 类元数据
6.1.1 TypeDef元数据表
6.1.2 TypeRef元数据表
6.1.3 Interfacelmpl元数据表
6.1.4 NestedClass元数据表
6.1.5 ClassLayout元数据表
6.2 名称空间和全类名
6.2.1 ILAsm命名规则
6.2.2 名称空间
6.2.3 全类名
6.3 类属性
6.3.1 标志
6.3.2 类引用
6.3.3 父类型
6.3.4 接口实现
6.3.5 类布局信息
6.4 接口
6.5 值类型
6.5.1 装箱值类型和拆箱值类型
6.5.2 值类型的实例成员
6.5.3 值类型的派生
6.6 枚举
6.7 委托
6.8 嵌套类型
6.9 类的扩增
6.10 元数据验证规则
6.10.1 TypeDef表的验证规则
6.10.2 指定枚举的验证规则
6.10.3 TypeRef表的验证规则
6.10.4 Interfacelmpl表的验证规则
6.10.5 NestedClass表的验证规则
6.10.6 ClassLayout表的验证规则
第7章 基本类型和特征
7.1 公共语言运行环境中的基本类型
7.1.1 基本数据类型
7.1.2 数据指针类型
7.1.3 函数指针类型
7.1.4 向量和数组
7.1.5 修饰符
7.1.6 本机类型
7.1.7 变量类型
7.2 特征中的类表示
7.3 特征
7.3.1 调用约定
7.3.2 字段特征
7.3.3 方法和属性特征
7.3.4 MemberRef特征
7.3.5 间接调用特征
7.3.6 局部变量特征
7.3.7 类型说明
7.4 特征验证规则
第8章 宇段和数据常量
8.1 字段元数据
8.2 实例和静态字段
8.3 默认值
8.4 映射字段
8.5 数据常量声明
8.6 显式布局和联合声明
8.7 全局字段
8.8 构造函数与数据常量
8.9 元数据验证规则
8.9.1 Field表的验证规则
8.9.2 FieldLayout表的验证规则
8.9.3 FieldRVA表的验证规则
8.9.4 FieldMarshal表的验证规则
8.9.5 Constant表的验证规则
8.9.6 MemberRef表的验证规则
第9章 方法
9.1 方法元数据
9.1.1 方法表记录的记录项
9.1.2 方法标志
9.1.3 方法名称
9.1.4 方法实现标志
9.1.5 方法参数
9.1.6 引用方法
9.1.7 方法实现元数据
9.2 静态、实例和虚拟方法
9.3 显式方法重载
9.4 方法头属性
9.5 局部变量
9.6 类构造函数
9.7 实例构造函数
9.8 实例的终止函数
9.9 变量参数列表
9.10 全局方法
9.11 元数据验证规则
9.11.1 Method表验证规则
9.11.2 Param表验证规则
9.11.3 Methodlmpl表验证规则
第四部分 执行引擎剖析
第10章 几指令
10.1 长参数和短参数指令
10.2 标号和流控制指令
10.2.1 无条件转移指令
10.2.2 有条件转移指令
10.2.3 比较转移指令
10.2.4 switch指令
10.2.5 break指令
10.2.6 SEH块退出指令
10.2.7 SEH结束指令
10.2.8 ret指令
10.3 运算指令
10.3.1 栈控制
10.3.2 常量加载
10.3.3 间接加载
10.3.4 间接存储
10.3.5 算术操作
10.3.6 溢出算术操作
10.3.7 位逻辑运算操作
10.3.8 移位操作
10.3.9 转换操作
10.3.10 溢出转换操作
10.3.11 逻辑条件检查操作
10.3.12 块操作
10.4 寻址参数和局部变量
10.4.1 方法参数加载
10.4.2 方法参数地址加载
10.4.3 方法参数存储
10.4.4 方法参数列表
10.4.5 局部变量加载
10.4.6 局部变量引用加载
10.4.7 局部变量存储
10.4.8 局部块存储单元分配
10.4.9 前缀指令
10.5 寻址字段
10.6 调用方法
10.6.1 直接调用
10.6.2 间接调用
10.6.3 尾部调用
10.7 寻址类和值类型
10.8 向量指令
10.8.1 向量创建
10.8.2 元素地址加载
10.8.3 元素加载
10.8.4 元素存储
10.9 代码验证
第11章 结构化异常处理
11.1 SEH子句的内部表示
11.2 SEH子句的类型
11.3 SEH子句声明的标号格式
11.4 SEH子句声明的作用域格式
11.5 处理异常
11.6 异常类型
11.6.1 加载程序异常
11.6.2 JIT编译器异常
11.6.3 执行引擎异常
11.6.4 互操作异常
11.6.5 子类异常
11.6.6 非托管异常映射
11.7 SEH子句结构化规则
第五部分 特殊组件
第12章 事件和属性
12.1 事件和委托
12.2 事件元数据
12.2.1 Event表
12.2.2 EventMap表
12.2.3 MethodSemantics表
12.3 事件声明
12.4 属性元数据
12.4.1 Property表
12.4.2 PropertyMap表
12.5 属性声明
12.6 元数据验证规则
12.6.1 Event表的验证规则
12.6.2 EventMap表的验证规则
12.6.3 Property表的验证规则
12.6.4 PropertyMap表的验证规则
12.6.5 MethodSemantics表的验证规则
第13章 定制属性
13.1 定制属性的概念
13.2 CustomAttribute元数据表
13.3 定制属性值编码
13.4 定制属性声明
13.5 定制属性分类
13.5.1 执行引擎和JIT编译器
13.5.2 互操作子系统
13.5.3 安全
13.5.4 远程子系统
13.5.5 Visual Studio.NET调试器
13.5.6 配件连接器
13.5.7 公共语言规范(CLS)兼容性
13.5.8 伪定制属性
13.6 元数据验证规则
第14章 安全属性
14.1 描述性安全
14.2 描述性操作
14.3 安全许可权限
14.3.1 访问许可权限
14.3.2 身份许可权限
14.3.3 定制许可权限
14.3.4 许可权限集
14.4 描述性安全元数据
14.5 安全属性声明
14.6 元数据验证规则
第六部分 互操作性
第15章 托管和非托管代码的互操作
15.1 替换程序和包装器
15.1.1 P/Invoke替换程序
15.1.2 实现映射元数据和验证规则
15.1.3 IJW替换程序
15.1.4 COM可调用包装器
15.1.5 运行时可调用包装器
15.2 数据编组
15.2.I blittable类型
15.2.2 in/out参数
15.2.3 字符串编组
15.2.4 对象编组
15.2.5 类的编组
15.2.6 数组编组
15.2.7 委托的编组
15.3 为非托管方法提供托管方法作为回调
15.4 作为非托管输出的托管方法
第16章 多语言工程
16.1 IL反汇编器
16.2 双向解析的原则
16.3 创造性的双向解析
16.4 使用类的增强
16.5 通过双向解析进行模块连接
16.6 调试模式中的编译
第七部分 附录
附录A IL Assembler语法
附录B 元数据表
附录C 几指令集
附录D IL Assembler和IL Disassembler的命令行选项
附录E 离线验证工具
第一部分 快速入门
第1章 简单示例
1.1 公共语言运行环境简介
1.2 开始简单示例
1.2.1 程序头
1.2.2 类声明
1.2.3 字段声明
1.2.4 方法声明
1.2.5 全局项
1.2.6 映射字段
1.2.7 数据声明
1.2.8 作为占位符的值类型
1.2.9 调用非托管代码
1.3 类的提前声明
1.4 小结
第2章 增强代码
2.1 代码维护
2.2 保护代码
2.3 小结
第二部分 底层结构
第3章 托管可执行文件的结构
3.1 PE/COFF头
3.1.1 MS-DOS占位程序和PE特征
3.1.2 COFF头
3.1.3 PE头
3.1.4 区域头
3.2 公共语言运行环境头
3.2.1 头结构
3.2.2 Flags字段
3.2.3 EntryPointToken字段
3.2.4 VTableFixups字段
3.2.5 StrongNameSignature字段
3.3 重定位区域
3.4 正文区域
3.5 数据区域
3.5.1 数据常量
3.5.2 V表
3.5.3 非托管导出表
3.5.4 线程局部存储
3.6 资源
3.6.1 非托管资源
3.6.2 托管资源
3.7 小结
第4章 元数据表组织
4.1 什么是元数据
4.2 堆和表
4.2.1 堆
4.2.2 通用元数据头
4.2.3 元数据表流
4.3 RID和标识
4.3.1 RID
4.3.2 标识
4.3.3 编码标识
4.4 元数据验证
4.5 小结
第三部分 基本组件
第5章 模块和配件
5.1 什么是配件
5.1.1 私有配件和共享配件
5.1.2 作为逻辑执行单元的应用域
5.2 清单
5.2.1 配件元数据表和声明
5.2.2 AssemblyRef元数据表和声明
5.2.3 加载程序搜索配件
5.2.4 Module元数据表和声明
5.2.5 ModuleRef元数据表和声明
5.2.6 Pde元数据表和声明
5.2.7 托管资源元数据和声明
5.2.8 ExpoaedType元数据表和声明
5.3 ILAsm中清单声明的次序
5.4 单模块配件和多模块配件
5.5 元数据验证规则
5.5.1 Assembly表验证规则
5.5.2 AssemblyRef表验证规则
5.5.3 Module表验证规则
5.5.4 ModuleRef表验证规则
5.5.5 File表验证规则
5.5.6 ManifestResouree表验证规则
5.5.7 ExpoaedType表验证规则
第6章 名称空间和类
6.1 类元数据
6.1.1 TypeDef元数据表
6.1.2 TypeRef元数据表
6.1.3 Interfacelmpl元数据表
6.1.4 NestedClass元数据表
6.1.5 ClassLayout元数据表
6.2 名称空间和全类名
6.2.1 ILAsm命名规则
6.2.2 名称空间
6.2.3 全类名
6.3 类属性
6.3.1 标志
6.3.2 类引用
6.3.3 父类型
6.3.4 接口实现
6.3.5 类布局信息
6.4 接口
6.5 值类型
6.5.1 装箱值类型和拆箱值类型
6.5.2 值类型的实例成员
6.5.3 值类型的派生
6.6 枚举
6.7 委托
6.8 嵌套类型
6.9 类的扩增
6.10 元数据验证规则
6.10.1 TypeDef表的验证规则
6.10.2 指定枚举的验证规则
6.10.3 TypeRef表的验证规则
6.10.4 Interfacelmpl表的验证规则
6.10.5 NestedClass表的验证规则
6.10.6 ClassLayout表的验证规则
第7章 基本类型和特征
7.1 公共语言运行环境中的基本类型
7.1.1 基本数据类型
7.1.2 数据指针类型
7.1.3 函数指针类型
7.1.4 向量和数组
7.1.5 修饰符
7.1.6 本机类型
7.1.7 变量类型
7.2 特征中的类表示
7.3 特征
7.3.1 调用约定
7.3.2 字段特征
7.3.3 方法和属性特征
7.3.4 MemberRef特征
7.3.5 间接调用特征
7.3.6 局部变量特征
7.3.7 类型说明
7.4 特征验证规则
第8章 宇段和数据常量
8.1 字段元数据
8.2 实例和静态字段
8.3 默认值
8.4 映射字段
8.5 数据常量声明
8.6 显式布局和联合声明
8.7 全局字段
8.8 构造函数与数据常量
8.9 元数据验证规则
8.9.1 Field表的验证规则
8.9.2 FieldLayout表的验证规则
8.9.3 FieldRVA表的验证规则
8.9.4 FieldMarshal表的验证规则
8.9.5 Constant表的验证规则
8.9.6 MemberRef表的验证规则
第9章 方法
9.1 方法元数据
9.1.1 方法表记录的记录项
9.1.2 方法标志
9.1.3 方法名称
9.1.4 方法实现标志
9.1.5 方法参数
9.1.6 引用方法
9.1.7 方法实现元数据
9.2 静态、实例和虚拟方法
9.3 显式方法重载
9.4 方法头属性
9.5 局部变量
9.6 类构造函数
9.7 实例构造函数
9.8 实例的终止函数
9.9 变量参数列表
9.10 全局方法
9.11 元数据验证规则
9.11.1 Method表验证规则
9.11.2 Param表验证规则
9.11.3 Methodlmpl表验证规则
第四部分 执行引擎剖析
第10章 几指令
10.1 长参数和短参数指令
10.2 标号和流控制指令
10.2.1 无条件转移指令
10.2.2 有条件转移指令
10.2.3 比较转移指令
10.2.4 switch指令
10.2.5 break指令
10.2.6 SEH块退出指令
10.2.7 SEH结束指令
10.2.8 ret指令
10.3 运算指令
10.3.1 栈控制
10.3.2 常量加载
10.3.3 间接加载
10.3.4 间接存储
10.3.5 算术操作
10.3.6 溢出算术操作
10.3.7 位逻辑运算操作
10.3.8 移位操作
10.3.9 转换操作
10.3.10 溢出转换操作
10.3.11 逻辑条件检查操作
10.3.12 块操作
10.4 寻址参数和局部变量
10.4.1 方法参数加载
10.4.2 方法参数地址加载
10.4.3 方法参数存储
10.4.4 方法参数列表
10.4.5 局部变量加载
10.4.6 局部变量引用加载
10.4.7 局部变量存储
10.4.8 局部块存储单元分配
10.4.9 前缀指令
10.5 寻址字段
10.6 调用方法
10.6.1 直接调用
10.6.2 间接调用
10.6.3 尾部调用
10.7 寻址类和值类型
10.8 向量指令
10.8.1 向量创建
10.8.2 元素地址加载
10.8.3 元素加载
10.8.4 元素存储
10.9 代码验证
第11章 结构化异常处理
11.1 SEH子句的内部表示
11.2 SEH子句的类型
11.3 SEH子句声明的标号格式
11.4 SEH子句声明的作用域格式
11.5 处理异常
11.6 异常类型
11.6.1 加载程序异常
11.6.2 JIT编译器异常
11.6.3 执行引擎异常
11.6.4 互操作异常
11.6.5 子类异常
11.6.6 非托管异常映射
11.7 SEH子句结构化规则
第五部分 特殊组件
第12章 事件和属性
12.1 事件和委托
12.2 事件元数据
12.2.1 Event表
12.2.2 EventMap表
12.2.3 MethodSemantics表
12.3 事件声明
12.4 属性元数据
12.4.1 Property表
12.4.2 PropertyMap表
12.5 属性声明
12.6 元数据验证规则
12.6.1 Event表的验证规则
12.6.2 EventMap表的验证规则
12.6.3 Property表的验证规则
12.6.4 PropertyMap表的验证规则
12.6.5 MethodSemantics表的验证规则
第13章 定制属性
13.1 定制属性的概念
13.2 CustomAttribute元数据表
13.3 定制属性值编码
13.4 定制属性声明
13.5 定制属性分类
13.5.1 执行引擎和JIT编译器
13.5.2 互操作子系统
13.5.3 安全
13.5.4 远程子系统
13.5.5 Visual Studio.NET调试器
13.5.6 配件连接器
13.5.7 公共语言规范(CLS)兼容性
13.5.8 伪定制属性
13.6 元数据验证规则
第14章 安全属性
14.1 描述性安全
14.2 描述性操作
14.3 安全许可权限
14.3.1 访问许可权限
14.3.2 身份许可权限
14.3.3 定制许可权限
14.3.4 许可权限集
14.4 描述性安全元数据
14.5 安全属性声明
14.6 元数据验证规则
第六部分 互操作性
第15章 托管和非托管代码的互操作
15.1 替换程序和包装器
15.1.1 P/Invoke替换程序
15.1.2 实现映射元数据和验证规则
15.1.3 IJW替换程序
15.1.4 COM可调用包装器
15.1.5 运行时可调用包装器
15.2 数据编组
15.2.I blittable类型
15.2.2 in/out参数
15.2.3 字符串编组
15.2.4 对象编组
15.2.5 类的编组
15.2.6 数组编组
15.2.7 委托的编组
15.3 为非托管方法提供托管方法作为回调
15.4 作为非托管输出的托管方法
第16章 多语言工程
16.1 IL反汇编器
16.2 双向解析的原则
16.3 创造性的双向解析
16.4 使用类的增强
16.5 通过双向解析进行模块连接
16.6 调试模式中的编译
第七部分 附录
附录A IL Assembler语法
附录B 元数据表
附录C 几指令集
附录D IL Assembler和IL Disassembler的命令行选项
附录E 离线验证工具