第1章 .NET简介 1
1.1 什么是.NET 1
1.1.1 微软软件开发平台 1
1.1.2 一组规范 1
1.1.3 .NET概览 1
1.2 发展历程 2
1.2.1 过去 2
1.2.2 现在 2
1.2.3 未来 3
1.3 微软和Windows以外的.NET 3
1.3.1 ECMA组织与.NET 3
1.3.2 W3C联盟 4
1.3.3 Mono项目 4
1.3.4 微软SSCLI项目 4
1.4 .NET资源链接 5
1.4.1 网站 5
1.4.2 新闻组 5
1.4.3 博客 6
第一部分 .NET平台
第2章 程序集、模块和IL语言 10
2.1 程序集、模块和资源文件 10
2.1.1 程序集和模块 10
2.1.2 资源文件 10
2.1.3 程序集、模块、类型和资源 10
2.1.4 为何对多模块程序集感兴趣 11
2.1.5 ILMerge工具 11
2.2 模块的剖析 11
2.2.1 可移植的可执行文件简介 11
2.2.2 模块的结构 11
2.2.3 清单的结构 12
2.2.4 类型元数据段的结构 12
2.3 使用ildasm.exe和Reflector工具分析程序集 14
2.3.1 创建需要分析的程序集 14
2.3.2 使用ildasm.exe分析模块 15
2.3.3 Reflector工具 16
2.4 程序集attribute和版本设定 17
2.4.1 程序集的标准attribute 17
2.4.2 程序集的版本设定 18
2.4.3 友元程序集 18
2.5 强名称程序集 19
2.5.1 简介 19
2.5.2 sn.exe工具 19
2.5.3 公钥记号 20
2.5.4 为程序集签名 21
2.5.5 具体示例 21
2.5.6 程序集的延迟签名 23
2.6 国际化/本地化与卫星程序集 23
2.6.1 区域设置和本地化 23
2.6.2 资源文件 24
2.6.3 在代码中使用资源 25
2.6.4 创建卫星程序集 26
2.6.5 部署和使用卫星程序集 26
2.6.6 避免在资源无法找到时引发异常 27
2.6.7 Visual Studio与卫星程序集 28
2.6.8 区域设置与字符串格式化 28
2.7 IL语言简介 29
2.7.1 栈及其特殊的IL指令 29
2.7.2 示例1:局部变量与栈 29
2.7.3 示例2:方法调用与栈 30
2.7.4 用于比较、分支和跳转的IL指令 31
2.7.5 IL的面向对象特性 32
2.7.6 元数据符号 32
第3章 生成、部署以及配置.NET应用程序 34
3.1 用MSBuild生成应用程序 34
3.2 MSBuild:目标、任务、属性、项与条件 34
3.2.1 .proj文件、目标与任务 34
3.2.2 属性 36
3.2.3 项 36
3.2.4 条件 37
3.3 高级 MSBuild 38
3.3.1 增量生成与目标间的依赖 38
3.3.2 MSBuild转换 38
3.3.3 将一个MSBuild项目分解到多个文件 39
3.3.4 Visual Studio 2005如何利用MSBuild 39
3.3.5 创建自定义MSBuild任务 39
3.4 配置文件 41
3.4.1 machine.config文件 41
3.4.2 标准配置参数 41
3.4.3 使用 < appSettings >元素定义配置参数 42
3.4.4 使用配置节定义配置参数 42
3.4.5 使用Visual Studio 2005创建配置节 44
3.4.6 配置节的注意事项 44
3.5 程序集部署:XCopy与GAC 45
3.5.1 XCopy部署 45
3.5.2 共享程序集与GAC文件夹 45
3.5.3 GAC的并存存储模型是如何解决DLL hell问题的 46
3.5.4 并存执行 46
3.5.5 查看及编辑GAC文件夹 46
3.6 发布者策略程序集 47
3.6.1 潜在的问题 47
3.6.2 解决方案 47
3.6.3 创建发布者策略程序集 48
3.7 .NET应用程序部署简介 49
3.7.1 MSI、cab、XCopy、ClickOnce 和NTD之间的对比 49
3.7.2 MSI与ClickOnce的对比 50
3.8 使用cab文件部署应用程序 50
3.9 使用MSI技术部署应用程序 52
3.9.1 添加文件 52
3.9.2 安装快捷方式 52
3.9.3 在GAC文件夹中添加一个共享程序集 52
3.9.4 安装项目属性 53
3.9.5 更新注册表 53
3.9.6 指定在安装期间执行的自定义动作 53
3.9.7 为安装提供一个自定义用户界面 54
3.10 使用ClickOnce技术部署应用程序 54
3.10.1 部署文件夹 54
3.10.2 为ClickOnce部署做准备 55
3.10.3 ClickOnce部署与移动代码安全 56
3.10.4 按需安装与下载组 57
3.10.5 更新一个使用ClickOnce安装的应用程序 58
3.10.6 应用程序所需的CAS权限集的工作机制 58
3.10.7 ClickOnce应用程序安装与执行的细节 59
3.11 使用无接触部署(NTD)技术部署应用程序 60
3.12 如果目标机器上没有安装.NET运行库怎么办 61
第4章 CLR 62
4.1 应用程序域 62
4.1.1 简介 62
4.1.2 线程与AppDomain 62
4.1.3 卸载AppDomain 63
4.1.4 AppDomain和孤立性 63
4.1.5 System.AppDomain类 63
4.1.6 在一个进程中承载多个应用程序 63
4.1.7 在其他AppDomain的上下文中运行代码 65
4.1.8 AppDomain类的事件 65
4.1.9 在同一个进程的AppDomain之间共享信息 66
4.2 在Windows进程内通过运行库宿主加载CLR 67
4.2.1 mscorsvr.dll和mscorwks.dll 67
4.2.2 mscorlib.dll程序集 67
4.2.3 运行库宿主介绍 67
4.2.4 在同一台计算机上承载多个版本的CLR 68
4.2.5 使用CorBindToRuntimeEx()函数加载CLR 68
4.2.6 创建一个自定义的运行库宿主 69
4.2.7 在自定义运行库宿主中调整CLR 71
4.2.8 SQL Server 2005运行库宿主的特性 71
4.3 剖析.NET应用程序的执行状况 73
4.4 定位和加载程序集 73
4.4.1 CLR何时尝试定位程序集 74
4.4.2 CLR使用的定位算法 74
4.4.3 配置文件的 < assemblyBinding >元素 75
4.4.4 定位算法示意图 76
4.4.5 影子复制机制 76
4.5 运行库类型解析 77
4.5.1 显式或隐式加载程序集 77
4.5.2 编译时引用程序集 78
4.5.3 示例 78
4.5.4 类型解析算法示意图 79
4.6 JIT(即时)编译 79
4.6.1 可移植的二进制代码 79
4.6.2 即时编译技术简介 80
4.6.3 ngen.exe工具 81
4.6.4 性能计数器与JIT编译 81
4.7 垃圾收集器和托管堆 83
4.7.1 垃圾收集技术简介 83
4.7.2 垃圾收集算法遇到的问题 83
4.7.3 .NET的GC 84
4.7.4 第一步:寻找根对象 84
4.7.5 第二步:建立活动对象树 84
4.7.6 第三步:解除分配非活动对象 84
4.7.7 第四步:清理堆碎片 85
4.7.8 第五步:重新计算托管引用所使用的物理地址 85
4.7.9 推荐做法 85
4.7.10 针对大对象的特殊堆 86
4.7.11 多线程环境下的垃圾收集 86
4.7.12 弱引用 86
4.7.13 使用System.GC类影响GC的行为 87
4.8 提高代码可靠性的机制 89
4.8.1 异步异常及托管代码可靠性 89
4.8.2 受约束执行区域 90
4.8.3 如何定义CER 90
4.8.4 内存门 90
4.8.5 可靠性契约 91
4.8.6 关键终结器 91
4.8.7 临界区 92
4.9 CLI和CLS 92
4.9.1 .NET语言必须满足的要求 92
4.9.2 从开发人员的观点看CLI和CLS 93
第5章 进程、线程与同步 94
5.1 简介 94
5.2 进程 94
5.2.1 简介 94
5.2.2 System.Diagnostics.Process类 95
5.2.3 创建和销毁子进程 95
5.2.4 避免在一台机器上同时运行同一应用程序的多个实例 95
5.2.5 终止当前进程 96
5.3 线程 96
5.3.1 简介 96
5.3.2 受托管的线程与Windows线程 97
5.3.3 抢占式多任务处理 97
5.3.4 进程与线程的优先级 97
5.3.5 System.Threading.Thread类 98
5.3.6 创建与联结线程 99
5.3.7 挂起线程 99
5.3.8 终止线程 100
5.3.9 前台线程与后台线程 100
5.3.10 受托管线程的状态图 101
5.4 访问资源同步简介 101
5.4.1 竞态条件 101
5.4.2 死锁 102
5.5 使用volatile字段与Interlocked类实现同步 102
5.5.1 volatile字段 102
5.5.2 System.Threading.Inter-locked类 103
5.5.3 Interlocked类提供的其他功能 104
5.6 使用System.Threading.Monitor类与C#的lock关键字实现同步 104
5.6.1 Enter()方法和Exit()方法 104
5.6.2 C#的lock关键字 105
5.6.3 SyncRoot模式 106
5.6.4 线程安全类 106
5.6.5 Monitor.TryEnter()方法 107
5.6.6 Monitor类的Wait()方法、Pulse()方法以及PulseAll()方法 107
5.7 使用Win32对象同步:互斥体、事件与信号量 109
5.7.1 共享Win32同步对象 109
5.7.2 互斥体 110
5.7.3 事件 110
5.7.4 信号量 112
5.8 利用System.Threading.Reader-WriterLock类实现同步 113
5.9 利用System.Runtime.Remoting.Contexts.SynchronizationAttr-ibute实现同步 114
5.9.1 同步域简介 115
5.9.2 System.Runtime.Remoting.Contexts.Synchronization与同步域 116
5.9.3 重入与同步域 117
5.9.4 另一个名为Synchronization 的attribute 119
5.10 CLR的线程池 119
5.10.1 简
评论1