《C#和.NET 2.0实战 平台、语言与框架》PDF下载

  • 购买积分:21 如何计算积分?
  • 作  者:(法)Patrick Smacchia著;施凡等译
  • 出 版 社:北京:人民邮电出版社
  • 出版年份:2008
  • ISBN:711516620X
  • 页数:765 页
图书介绍:本书是一本知识密集的C#技术经典图书,Microsoft .NET MVP力作!众多.NET专家口口相传的一本秘籍。书中分为三部分,第一部分讲述底层的.NET平台,涵盖了.NET各方面的基础知识和工作原理;第二部分是C#语言部分,通过与C++比较的方式进行讲解,清晰易懂;第三部分讲述.NET Framework中的基本类库,内容涉及.NET常见领域的全部知识。

第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平台 10

第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 简介 119

5.10.2 使用线程池 120

5.11 定时器 121

5.11.1 System.Timers.Timer类 121

5.11.2 System.Threading.Timer类 122

5.11.3 System.Windows.Forms.Timer类 123

5.12 异步方法调用 123

5.12.1 异步委托 123

5.12.2 回调方法 124

5.12.3 向回调方法传递状态 125

5.12.4 one-way调用 126

5.13 线程-资源亲缘性 126

5.13.1 System.ThreadStatic-Attribute 127

5.13.2 线程本地存储(TLS) 127

5.13.3 System.ComponentModel.ISynchronizeInvoke接口 130

5.14 执行上下文简介 130

第6章 安全性 133

6.1 代码访问安全性(CAS)概述 133

6.1.1 什么是移动代码 133

6.1.2 CAS:全局观 133

6.1.3 给程序集代码授予权限 134

6.1.4 在运行程序集的代码时检查权限 134

6.2 CAS:证据和权限 134

6.2.1 什么是证据 134

6.2.2 .NET Framework所提供的标准证据 134

6.2.3 谁提供证据 137

6.2.4 权限 137

6.2.5 标准权限 137

6.2.6 标识权限 138

6.2.7 安全权限 138

6.2.8 自定义权限 138

6.3 CAS:通过应用安全策略根据证据授予权限 139

6.3.1 安全策略级别 139

6.3.2 剖析安全策略 139

6.3.3 用于应用安全策略的算法 139

6.3.4 默认安全策略配置 140

6.3.5 配置安全策略 141

6.4 CAS:FullTrust权限 142

6.5 CAS:从源代码进行命令式的权限检查 142

6.5.1 CodeAccessPermissions类和PermissionSet类 143

6.5.2 Demand()方法 143

6.5.3 Deny()方法、RevertDeny()方法、PermitOnly()方法和Reve-rtPermitonly()方法 143

6.5.4 Assert()方法和RevertAssert()方法 144

6.5.5 FromXml()方法和ToXml()方法 145

6.5.6 System.Security.IPermission接口 145

6.6 CAS:使用attribute进行声明式的权限检查 145

6.6.1 加载程序集时调整所授权限集合的attribute 146

6.6.2 命令式与声明式的对比 146

6.7 CAS:测试和调试移动代码的实用机制 147

6.8 CAS:独立存储区权限 147

6.9 .NET、Windows用户与角色 147

6.9.1 Windows安全简介 148

6.9.2 IIdentity接口与IPrincipal接口 149

6.9.3 Windows安全标识符 149

6.9.4 在底层Windows线程中模拟用户 150

6.10 .NET与Windows资源的访问控制 151

6.10.1 Windows访问控制简介 151

6.10.2 在.NET代码中使用特殊的SD 152

6.10.3 在.NET代码中使用通用的SD 154

6.11 .NET与角色 155

6.11.1 定义应用程序域的主体策略 155

6.11.2 检查用户是否属于某个特定角色 156

6.11.3 COM+角色 157

6.12 .NET与密码学:对称算法 158

6.12.1 对称算法概述 158

6.12.2 .NET Framework与对称算法 158

6.13 .NET与密码学:非对称算法(公钥私钥) 160

6.13.1 非对称算法概述 160

6.13.2 安全会话简介 161

6.13.3 RSA算法 161

6.13.4 非对称算法与数字签名 161

6.13.5 .NET Framework与RSA算法 162

6.14 数据保护API 163

6.14.1 Windows的数据保护API 163

6.14.2 System.Security.Crypto-graphy.ProtectedData类 163

6.14.3 System.Security.Crypto-graphy.ProtectedMemory类 164

6.14.4 System.Security.SecureString类 164

6.14.5 保护配置文件中的数据 165

6.14.6 确保网络传输中数据的安全 166

6.15 使用Authenticode技术与X.509证书验证程序集 166

6.15.1 Authenticode与强名称 166

6.15.2 证书与证书认证中心 167

6.15.3 根证书 167

6.15.4 Windows、.NET与Authenti-code技术 167

第7章 反射、后期绑定与attribute 168

7.1 反射 168

7.1.1 何时需要反射 168

7.1.2 .NET反射有何新意 168

7.1.3 对载入AppDomain的程序集的反射 170

7.1.4 从元数据获取信息 170

7.2 后期绑定 171

7.2.1 “绑定类”的含义 171

7.2.2 早期绑定与动态绑定 172

7.2.3 后期绑定 172

7.2.4 在C#编译到IL期间如何实例化一个未知的类 173

7.2.5 使用后期绑定 176

7.2.6 利用接口:使用后期绑定的正确方法 178

7.3 attribute 180

7.3.1 attribute是什么 180

7.3.2 何时需要attribute 180

7.3.3 关于attribute应该知道的事 180

7.3.4 可以应用attribute的代码元素 181

7.3.5 .NET Framework中的一些标准attribute 181

7.3.6 自定义的attribute的示例 182

7.3.7 条件attribute 185

7.4 动态生成程序集并在运行中使用 185

7.4.1 为什么要考虑动态生成程序集 185

7.4.2 一个实际的问题 186

7.4.3 理想的第三种解决方案——动态创建程序集 187

7.4.4 将程序集保存到磁盘上的能力 190

7.4.5 结论 190

第8章 .NET与本机代码/COM/COM+之间的互操作性 191

8.1 P/Invoke 191

8.1.1 DllImportAttribute 191

8.1.2 类型转换 192

8.1.3 使用指针传递参数 193

8.1.4 传递字符串 193

8.1.5 传递结构与联合 195

8.1.6 方向attribute 196

8.1.7 委托与非托管的函数指针 196

8.2 C++/CLI语言互操作性简介 196

8.2.1 IJW功能 196

8.2.2 托管类型与非托管类型共存 197

8.2.3 在本机代码中使用托管对象 199

8.3 .NET与Win32句柄 200

8.3.1 简介 200

8.3.2 HandleCollector类 201

8.3.3 SafeHandle类与Critical-Handle类 201

8.4 在.NET中使用COM对象 201

8.4.1 类型元数据与类型库 201

8.4.2 Interop程序集与Runtime Callable Wrapper类 202

8.4.3 访问不使用类型库的COM组件中的COM类 204

8.4.4 使用Visual Studio导入ActiveX 204

8.4.5 使用RCW类时需要牢记的COM特性 205

8.4.6 COM类的显式后期绑定 206

8.4.7 免注册COM 207

8.5 将.NET对象包装成CCW 208

8.5.1 CCW简介 208

8.5.2 从.NET程序集中生成描述CCW类的COM类型库 209

8.5.3 在操作系统上注册CCW 211

8.5.4 将.NET程序集作为COM组件使用 212

8.5.5 .NET异常与CCW 213

8.5.6 处理对象生命周期 213

8.6 COM+简介 214

8.6.1 COM+是什么 214

8.6.2 在.NET中使用COM+:企业服务 214

8.7 COM+企业服务简介 214

8.7.1 COM+企业服务的完整列表 214

8.7.2 你需要COM+企业服务吗 215

8.8 在.NET类中利用COM+服务 216

8.8.1 服务组件简介 216

8.8.2 声明服务组件使用的企业服务 216

8.8.3 COM+上下文与服务组件 217

8.8.4 COM+应用程序简介 217

8.8.5 COM+目录 218

8.8.6 COM+应用程序的激活模式 218

8.8.7 安装服务组件 219

8.8.8 查看并操作COM+目录 221

8.8.9 构建一个使用服务组件的客户 221

第二部分 C#语言 224

第9章 语言基本概念 224

9.1 源代码组织 224

9.1.1 命名空间 224

9.1.2 命名空间中可声明的全套语法元素 225

9.1.3 C#项目的结构 226

9.1.4 命名空间和程序集的组织 226

9.2 编译步骤 226

9.3 预处理器 227

9.3.1 预处理符号与条件编译 227

9.3.2 预处理符号与条件attribute 228

9.3.3 #error指令和#warning指令 228

9.3.4 #pragma warning disable指令和#pragma warning restore指令 229

9.3.5 #line指令 229

9.3.6 #region指令和#endregion指令 230

9.4 csc.exe编译器 230

9.5 别名机制 232

9.5.1 创建命名空间和类型的别名 232

9.5.2 命名空间别名限定符 232

9.5.3 全局限定符 233

9.5.4 外部别名 234

9.6 注释和自动文档 234

9.6.1 注释 234

9.6.2 使用Visual Studio的任务列表 235

9.6.3 自动文档 235

9.7 标识符 237

9.8 控制结构 237

9.8.1 条件语句(if/else、?:和switch) 238

9.8.2 循环语句(do、while、for和foreach) 241

9.8.3 goto语句 243

9.9 Main()方法 243

第10章 从C#2.0的角度看.NET 2.0类型系统 245

10.1 对象在内存中的存储 245

10.1.1 对象的分配和解除分配 245

10.1.2 托管线程栈 245

10.1.3 托管堆 245

10.1.4 对象存储:托管线程栈与托管堆的比较 246

10.1.5 静态分配与动态分配的比较 246

10.2 引用类型和值类型 246

10.3 公共类型系统(CTS) 249

10.3.1 .NET类型不与任何编程语言关联 249

10.3.2 CTS:全局观 249

10.4 System.Object类 249

10.5 对象比较 251

10.5.1 等价与恒等 251

10.5.2 自定义相等比较规则 252

10.5.3 相等性与散列表 252

10.5.4 自定义大小比较规则 253

10.6 对象克隆 253

10.7 装箱和拆箱 255

10.7.1 装箱 255

10.7.2 装箱导致的危险问题 256

10.7.3 拆箱 257

10.8 基本类型 257

10.8.1 整型 258

10.8.2 实型 259

10.8.3 布尔型 260

10.8.4 字符型 260

10.8.5 整数和字符串之间的转换 260

10.9 基本类型的运算 261

10.9.1 同一基本类型上的算术运算 261

10.9.2 处理被零除的错误 262

10.9.3 处理溢出 262

10.9.4 运算符的优先级 262

10.9.5 前缀和后缀递增/递减运算符 263

10.9.6 不同基本类型之间的算术运算 263

10.9.7 位运算 264

10.10 结构 265

10.11 枚举 267

10.11.1 枚举和整型 267

10.11.2 System.Enum类 268

10.11.3 位域(一组标志) 269

10.12 字符串 269

10.12.1 System.String类 269

10.12.2 字符串字面常量 270

10.12.3 无转义字符串字面常量 270

10.12.4 使用字符串 271

10.12.5 格式化字符串 272

10.12.6 System.Text.StringBuilder类 273

10.13 委托类和委托对象 275

10.13.1 简介 275

10.13.2 委托对象与静态方法 275

10.13.3 C#2.0编译器的委托类推测功能 276

10.13.4 委托对象与实例方法 276

10.13.5 用一个委托对象引用多个方法 277

10.13.6 System.Delegate类 278

10.13.7 更改引用方法列表 279

10.14 可空类型 280

10.14.1 值类型和空值范式 280

10.14.2 System.Nullable〈T〉结构 280

10.14.3 C#语法革新:Nullable〈T〉关键字和null关键字 281

10.14.4 C#语法革新:Nullable〈T〉的等价写法T? 282

10.14.5 C#2.0中bool?的无差别对待 283

10.14.6 可空类型与装箱/拆箱 283

10.14.7 可空结构和可空枚举 284

10.15 部分类型 285

10.15.1 必须在每个部分声明上重复出现的类型声明元素 285

10.15.2 在每个部分声明上可选重复出现的类型声明元素 286

10.15.3 在多个部分声明上重复出现就会累积效果的类型声明元素 286

10.15.4 仅在某个部分声明上起作用的类型声明元素 286

第11章 类和对象 287

11.1 简介 287

11.2 术语 287

11.3 类的定义 288

11.4 字段 288

11.4.1 字段初始化 289

11.4.2 常数字段 289

11.4.3 字段初始化的潜在问题 290

11.5 方法 290

11.5.1 按值或按引用传递参数 290

11.5.2 C#的默认规则 291

11.5.3 按引用传递任意参数 291

11.5.4 在引用类型上使用ref关键字 292

11.5.5 参数初始化 292

11.5.6 输出参数 293

11.5.7 params关键字 294

11.5.8 方法重载 294

11.6 属性 295

11.6.1 get访问器 296

11.6.2 set访问器 296

11.6.3 关于属性的注释 297

11.7 索引器 297

11.8 事件 298

11.8.1 介绍 298

11.8.2 C#语法 298

11.8.3 一个实际的例子 299

11.8.4 异步事件处理 301

11.8.5 在同步条件下保护代码不受订阅者方法所抛异常的影响 302

11.9 嵌套类型 302

11.10 封装性和可见性 303

11.10.1 成员的可见性 303

11.10.2 类型的可见性 304

11.10.3 属性和索引器访问器的可见性 304

11.10.4 私有成员的附加说明 304

11.10.5 IL语言可见性的附加说明 304

11.11 this关键字 304

11.12 构造函数 305

11.12.1 构造函数的声明 305

11.12.2 创建对象时访问构造函数 306

11.13 对象终结和析构 307

11.13.1 析构函数、终结器和Object.Finalize()方法 307

11.13.2 IDisposable接口和Dispose()方法 308

11.13.3 何时需要终结器和Dispose()方法 310

11.14 静态成员 312

11.14.1 静态字段、属性和事件 312

11.14.2 静态方法 313

11.14.3 静态构造函数 313

11.14.4 静态类 314

11.15 运算符重载 314

11.15.1 算术运算符的重载 314

11.15.2 类型转换运算符的重载 316

11.15.3 比较运算符的重载 318

11.15.4 运算符重载和CLS 320

第12章 继承、多态性与抽象性 321

12.1 目标:代码重用 321

12.1.1 潜在问题 321

12.1.2 解决方案之一:类的继承 322

12.2 类的继承 322

12.2.1 语法 322

12.2.2 保护及内部或保护可见性级别 322

12.2.3 类继承图 322

12.2.4 调用基类的构造函数 323

12.2.5 基类成员的可见性 324

12.2.6 封闭类 324

12.3 虚方法和多态性 324

12.3.1 潜在问题 325

12.3.2 解决方案之一:虚方法和多态性 325

12.3.3 示例一则 325

12.3.4 屏蔽多态性 327

12.4 抽象性 328

12.4.1 潜在的问题 328

12.4.2 解决方案之一:抽象类和抽象方法 328

12.4.3 示例一则 328

12.4.4 同时使用abstract关键字和override关键字 329

12.5 接口 330

12.5.1 强制代码使用者使用抽象体代替实现体 331

12.5.2 解决方法命名的冲突 331

12.5.3 解决接口扩展带来的冲突 332

12.5.4 覆写接口的实现方法 333

12.5.5 接口与结构 334

12.6 虚拟或抽象属性、事件和索引器 335

12.7 is和as运算符 336

12.7.1 is运算符 336

12.7.2 as运算符 337

12.8 代码重用的解决方案 338

第13章 泛型 339

13.1 C#1.0的一个问题以及使用C#2.0泛型的解决方法 339

13.1.1 C#1.0中集合项的类型化问题 339

13.1.2 C#2.0泛型带来的理想方案 340

13.2 .NET 2.0泛型概览 341

13.2.1 声明多个类型参数 341

13.2.2 开放和封闭泛型类型 342

13.2.3 .NET泛型与C++模板的比较 342

13.2.4 泛型类型的可见性 343

13.2.5 泛型结构与接口 344

13.2.6 泛型类型与别名 344

13.3 类型参数的约束 344

13.3.1 默认构造函数约束 345

13.3.2 派生约束 345

13.3.3 引用类型或值类型约束 347

13.4 泛型类型的成员 347

13.4.1 方法重载 347

13.4.2 静态字段 348

13.4.3 静态方法 349

13.4.4 类构造函数 349

13.4.5 运算符重载 349

13.4.6 嵌套类型 350

13.5 运算符与泛型 351

13.5.1 类型参数的相等、不等及比较运算符 351

13.5.2 typeof运算符与泛型 351

13.5.3 params及lock关键字与泛型 352

13.5.4 default运算符 352

13.6 类型转换与泛型 353

13.6.1 基本规则 353

13.6.2 类型转换与泛型数组 353

13.6.3 is和as运算符 353

13.7 继承与泛型 354

13.7.1 基本规则 354

13.7.2 覆写泛型类型的虚方法 354

13.8 泛型方法 355

13.8.1 简介 355

13.8.2 泛型方法与约束 356

13.8.3 虚拟泛型方法 356

13.8.4 泛型方法类型参数的推测 356

13.8.5 C#2.0语法的二义性 357

13.9 委托、事件与泛型 358

13.9.1 简介 358

13.9.2 泛型委托与泛型方法 358

13.9.3 泛型与委托的协变性及反变性 359

13.9.4 事件和泛型委托 360

13.10 反射、attribute、IL与泛型 360

13.10.1 泛型与System.Type类 360

13.10.2 泛型与System.Reflec-tion.MethodBase类及System.Reflection.MethodInfo类 362

13.10.3 attribute与泛型 363

13.10.4 IL语言与泛型 364

13.11 .NET Framework 2.0中的泛型 364

13.11.1 对象序列化与泛型 364

13.11.2 .NET Remoting与泛型 365

13.11.3 集合与泛型 366

13.11.4 不支持泛型的领域 366

第14章 不安全代码、异常、匿名方法和迭代器 367

14.1 指针和不安全代码 367

14.1.1 允许不安全代码的编译器选项 368

14.1.2 在C#中声明不安全代码 368

14.2 在C#中使用指针 368

14.2.1 .NET中支持指针的类型 368

14.2.2 声明指针 368

14.2.3 提领和间接运算符 369

14.2.4 取大小运算符 369

14.2.5 指针运算 369

14.2.6 指针类型转换 369

14.2.7 双重指针 369

14.2.8 定址对象 370

14.2.9 指针和数组 370

14.2.10 固定数组 371

14.2.11 使用stackalloc关键字在栈上分配内存 372

14.2.12 字符串与指针 372

14.3 利用异常处理错误 372

14.3.1 潜在问题:如何恰当处理运行时出现的大多数错误 372

14.3.2 C#异常处理简介 373

14.4 异常对象和定义自己的异常类 374

14.4.1 System.Exception类 375

14.4.2 定义自己的异常类 375

14.4.3 从自己的代码中抛出异常 376

14.4.4 C#的非检查型异常 377

14.5 catch块和finally块 377

14.5.1 catch块的一些说明(异常处理程序) 377

14.5.2 finally块 378

14.5.3 增加异常语义 378

14.6 从构造函数或终结器中抛出的异常 379

14.6.1 静态构造函数所抛异常或静态字段初始化时所抛异常 379

14.6.2 终结器所抛异常 380

14.7 异常处理与CLR 380

14.8 异常处理与Visual Studio 382

14.9 异常管理使用指南 382

14.9.1 何时考虑抛出异常 382

14.9.2 在异常处理程序中做什么 382

14.9.3 在何处放置异常处理程序 383

14.9.4 异常与返回错误代码的对比 383

14.9.5 永远不要预测bug造成的后果能够被异常处理程序所捕获 383

14.10 匿名方法 383

14.10.1 C#2.0匿名方法简介 383

14.10.2 匿名方法可以接受参数 385

14.10.3 一个精妙的特殊语法 386

14.10.4 匿名方法与泛型 386

14.10.5 匿名方法的实际应用 386

14.11 C#2.0编译器与匿名方法 387

14.11.1 简单的方式 387

14.11.2 捕获局部变量 388

14.11.3 捕获的局部变量与代码复杂性 389

14.11.4 匿名方法访问外围方法的参数 391

14.11.5 匿名方法访问外围类的成员 391

14.12 匿名方法的高级用法 392

14.12.1 定义:闭包与词法环境 392

14.12.2 漫谈闭包 393

14.12.3 使用闭包代替类 393

14.12.4 委托与闭包 394

14.12.5 使用匿名方法处理集合 395

14.13 C#1.x迭代器 395

14.13.1 可枚举对象、枚举器和Iterator设计模式 395

14.13.2 实例一则 395

14.13.3 一个可枚举对象对应多个枚举器 397

14.13.4 C#1x迭代器的缺点 397

14.14 C#2.0迭代器 397

14.14.1 yield return关键字 397

14.14.2 迭代器与泛型 398

14.14.3 一个可枚举对象对应多个枚举 399

14.14.4 yield break关键字 400

14.14.5 yield return关键字和yield break关键字的语法限制 401

14.14.6 递归迭代器实例 401

14.15 C#2.0编译器与迭代器 402

14.15.1 编译器自动创建并使用的枚举器类 402

14.15.2 关于生成类的说明 404

14.16 C#2.0迭代器的高级用法 405

14.16.1 定义:协同例程和延拓 405

14.16.2 通过迭代器利用协同例程和延拓的威力 406

14.16.3 Pipeline模式 407

14.16.4 延拓与多线程的比较 409

14.16.5 C#2.0迭代器的一个限制 410

第三部分 .NET FrameWork第15章 集合 414

15.1 使用foreach和in关键字迭代访问集合中的项 414

15.1.1 在数组上使用foreach和in 414

15.1.2 交错数组上的foreach语法 415

15.1.3 在自定义集合类上支持foreach语法 415

15.2 数组 415

15.2.1 创建和引用数组 415

15.2.2 访问数组的项和处理越界访问 416

15.2.3 交错数组 417

15.2.4 初始化数组的项 418

15.2.5 数组的协变 419

15.2.6 System.Array类 419

15.2.7 位数组 421

15.3 序列 422

15.3.1 System.Collections.Generic.ICollection〈T〉接口 422

15.3.2 System.Collections.Generic.IList〈T〉接口 423

15.3.3 System.Collections.Generic.List〈T〉类 423

15.3.4 System.ComponentModel.IBindingList接口和System.ComponentModel.IListSource接口 425

15.3.5 System.Collections.Generic.LinkedList〈T〉类 425

15.3.6 字符串列表 426

15.3.7 System.Collections.Generic.Queue〈T〉类 426

15.3.8 System.Collections.Generic.Stack〈T〉类 427

15.4 字典 427

15.4.1 System.Collections.Generic.IDictionary〈K,V〉接口 427

15.4.2 System.Collections.Generic.SortedDictionary〈K,V〉类 428

15.4.3 System.Collections.Generic.Dictionary〈K,V〉类 428

15.4.4 迭代访问字典中的项 431

15.5 对集合中的项进行排序 431

15.5.1 IComparer〈T〉接口和Icom-parable〈T〉接口 432

15.5.2 对数组中的项排序 432

15.5.3 对LiSt〈T〉实例中的元素排序 434

15.6 用于处理集合的函数对象 434

15.6.1 特化的委托类型 434

15.6.2 使用匿名方法 435

15.6.3 List〈T〉类和Array类支持函数对象 436

15.6.4 C#2.0的迭代器和集合 437

15.7 System.Coliections.Generic和System.Collections之间的联系 438

第16章 基类 439

16.1 数学 439

16.1.1 System.Math类 439

16.1.2 System.Random类 440

16.2 时间、日期和持续时间 441

16.2.1 System.DateTime结构 441

16.2.2 System.TimeSpan结构 444

16.2.3 System.Diagnostics.Stopwatch类 445

16.3 驱动器、目录、文件和路径 445

16.3.1 操作驱动器 445

16.3.2 操作目录 446

16.3.3 操作文件 447

16.3.4 操作路径 448

16.3.5 文件系统监视器 448

16.4 注册表 450

16.4.1 引言 450

16.4.2 注册表的结构 450

16.4.3 注册表的层级 451

16.4.4 用.NET读/写注册表 451

16.5 调试 452

16.5.1 用来自定义对象调试时的视图的attribute 452

16.5.2 调试“仅我的代码” 453

16.5.3 调试模式 454

16.5.4 解决调试问题 454

16.6 跟踪 454

16.6.1 监听器 455

16.6.2 跟踪源和源级别 456

16.6.3 筛选跟踪源 457

16.6.4 跟踪缩进 457

16.7 正则表达式 458

16.7.1 引言 458

16.7.2 语法 459

16.7.3 示例 460

16.7.4 .NET和正则表达式 460

16.7.5 优化正则表达式的求值 460

16.8 控制台 462

16.8.1 光标 462

16.8.2 显示 462

16.8.3 大小与位置 462

16.8.4 颜色 462

16.8.5 数据输入 463

16.8.6 重定向控制台的流 463

16.8.7 杂项 463

第17章 输入、输出和流 464

17.1 流的简介 464

17.1.1 流的类层次结构 464

17.1.2 操作流的工具 464

17.1.3 流数据的类型化 465

17.1.4 字符串编码 465

17.2 读写文件 466

17.2.1 简单的文件读写 466

17.2.2 读写二进制数据文件 466

17.2.3 读写文本文件 467

17.2.4 以异步的方式操作流 468

17.3 用套接字来使用TCP/IP 470

17.3.1 套接字和TCP/IP简介 470

17.3.2 以同步的方式操作套接字 470

17.3.3 以异步的方式操作套接字 473

17.4 获取网络接口和状态的信息 476

17.4.1 发现可用网络接口 476

17.4.2 Ping 477

17.4.3 网络发生更改时所触发的事件 477

17.4.4 网络活动统计 477

17.5 HTTP和FTP客户端 478

17.5.1 URI 478

17.5.2 WebClient类 478

17.5.3 通过URI访问资源的其他类 479

17.6 在HTTP.SYS上用HttpListener编写HTTP服务器代码 479

17.6.1 HTTP.SYS简介 479

17.6.2 System.Net.HttpListener类 480

17.6.3 以异步方式处理HTTP请求 480

17.7 支持邮件协议 481

17.8 缓冲和压缩数据流 482

17.8.1 通过Decorator设计模式在流上应用服务 482

17.8.2 缓冲流数据 482

17.8.3 压缩数据流 483

17.9 在串行端口上读写数据 484

17.10 支持安全通讯协议:SSL、NTLM和Kerberos 484

17.10.1 安全通讯协议简介 484

17.10.2 安全通讯协议和System.Net.Security命名空间 484

17.10.3 SslStream类 485

17.10.4 NegociateStream类 486

17.10.5 加密数据流 487

第18章 Windows Forms应用程序 488

18.1 Windows用户界面 488

18.1.1 控制台应用程序与窗口应用程序 488

18.1.2 Windows消息简介 488

18.1.3 Windows应用程序开发的发展 488

18.1.4 System.Windows.Forms命名空间简介 489

18.2 Windows Forms开发简介 490

18.2.1 处理事件 491

18.2.2 编写方法 492

18.2.3 没有Visual Studio的Windows Forms开发 492

18.3 Windows Forms开发工具 494

18.3.1 模态/非模态对话框简介 494

18.3.2 鼠标和键盘事件 494

18.3.3 Paint事件 495

18.3.4 异步处理 495

18.3.5 其他特性 497

18.4 标准控件 498

18.4.1 Windows Forms 2.0控件的层次结构 498

18.4.2 新增控件概述 499

18.5 创建自定义控件 500

18.6 显示和编辑数据 504

18.6.1 Visual Studio 2005提供的工具 504

18.6.2 BindingSource控件 507

18.6.3 用BindingSource来利用数据源 508

18.6.4 用对象列表作为数据源 508

18.7 Windows Forms和本地化 509

18.8 GDI+ 510

18.8.1 System.Drawing.Graphics类 510

18.8.2 System.Drawing.Pen类 510

18.8.3 System.Drawing.Brush类 511

18.8.4 绘制文本 511

18.8.5 处理图像 512

18.8.6 优化图像的处理 513

18.8.7 动画和双缓冲 515

第19章 ADO.NET 2.0 517

19.1 数据库简介 517

19.1.1 DBMS 517

19.1.2 RDBMS 517

19.1.3 SQL语言 517

19.1.4 分布式架构的必要性 518

19.2 ADO.NET简介 518

19.2.1 连接模式与非连接模式 518

19.2.2 数据提供程序 519

19.2.3 ADO.NET:全局观 520

19.2.4 我们将在范例中使用的DB 520

19.3 连接与数据提供程序 522

19.3.1 解除应用程序与数据提供程序之间的耦合 522

19.3.2 连接字符串 525

19.3.3 如何存储连接字符串以及连接字符串存储在哪里 526

19.3.4 连接池 527

19.3.5 访问数据源的元数据 527

19.4 使用DataReader在连接模式下工作 528

19.4.1 使用DataReader从数据库中获取数据 528

19.4.2 在数据库端进行标量运算 529

19.4.3 使用SQL查询来修改数据 530

19.5 使用DataSet在非连接模式下工作 531

19.5.1 使用来自数据库的数据填充缓存 531

19.5.2 在DataSet中对多表之间的关联进行操作 532

19.5.3 将DataSet中更新的数据保存到数据库 533

19.5.4 非连接模式与乐观/悲观并发策略 534

19.5.5 DataSet中数据表的约束 535

19.5.6 DataView类 535

19.6 强类型DataSet 537

19.6.1 创建强类型DataSet类 538

19.6.2 TableAdapter和强类型SQL请求 539

19.7 连接模式和非连接模式之间的桥接器 540

19.8 对象与关系数据之间的桥接器 541

19.8.1 结构问题 541

19.8.2 行为问题 541

19.8.3 解决上述问题的途径 541

19.8.4 用于对象关系映射的.NET工具 542

19.9 SQL Server数据提供程序的专有功能 542

19.9.1 异步请求 542

19.9.2 批量复制 543

19.9.3 SqlClient连接上的统计数据 544

19.9.4 SQL Server 2005 Express版本 544

第20章 事务 545

20.1 事务简介 545

20.1.1 事务管理器、资源管理器和数据源 545

20.1.2 分布式事务以及2PC算法简介 546

20.1.3 在SQL Server连接上进行的本地事务 547

20.1.4 分布式事务协调器 548

20.2 System.Transactions 549

20.2.1 LTM、持久RM和易变RM简介 549

20.2.2 System.Transactions实现的隐式事务 550

20.2.3 在事务中被触发的事件 551

20.2.4 System.Transactions揭秘 552

20.2.5 事务隔离级别简介 552

20.2.6 事务作用域 553

20.2.7 System.Transactions实现的显式事务 553

20.3 System.Transactions的高级用法 554

20.3.1 在多个线程中执行一个事务 554

20.3.2 以异步方式完成事务 555

20.3.3 System.Transactions和CAS 555

20.4 用于实现自定义RM的机制 556

第21章 XML 560

21.1 简介 560

21.1.1 XML所解决的问题 560

21.1.2 统一文档世界和数据世界 560

21.1.3 XML文档的结构 561

21.2 XSD、XPath、XSLT和XQuery简介 562

21.2.1 用XSD schema类型化XML文档及其数据 562

21.2.2 Xpath 563

21.2.3 XSLT 563

21.2.4 XQuery 564

21.3 遍历和编辑XML文档的方法 564

21.4 使用XmlReader类和XmlWriter类的Cursor方法 564

21.4.1 使用XmlReader类读取数据 564

21.4.2 在读取数据时对其进行验证 566

21.4.3 使用Xmlwriter类编辑数据 566

21.5 使用XmlDocument类的Tree/DOM方法 567

21.5.1 使用XmlDocument类装载和遍历XML文档 567

21.5.2 使用XmlDocument类编辑和保存XML数据 568

21.5.3 使用XmlDocument类验证XML文档 568

21.5.4 XmlDocument类的事件 568

21.6 使用XPath遍历和编辑XML文档 569

21.6.1 对内存中的DOM树应用XPath表达式 569

21.6.2 用XPathNavigator对象遍历XPathDocument对象 569

21.6.3 用XPathNodeIterator对象遍历XPath的选择结果集 570

21.6.4 用XPathNavigator对象编辑XmlDocument对象 570

21.7 使用XSLT样式表转换XML文档 571

21.8 连接关系型数据与XML文档的桥接器 571

21.8.1 从DataSet获取XML文档 571

21.8.2 用XML文档填充DataSet 572

21.8.3 System.Xml.XmlDataDocument类 573

21.8.4 XML和SQL Server 574

21.9 连接对象与XML文档的桥梁 575

21.9.1 System.Xml.XmlSeriali-zation类 575

21.9.2 用于XML序列化的attribute 576

21.9.3 sgen.exe工具 576

21.9.4 xsd.exe工具 577

21.10 Visual Studio和XML 577

21.10.1 创建、查看以及编辑XML文档和XSD schema 577

21.10.2 用XSD schema验证XML文档 577

21.10.3 编辑和调试XSLT程序 578

第22章 .NET Remoting 579

22.1 简介 579

22.1.1 什么是.NET Remoting 579

22.1.2 FAQ 579

22.2 按引用封送 580

22.3 按值封送和二进制序列化 582

22.4 ObjectHandle类 584

22.5 对象的激活 585

22.5.1 分布式体系的组件 585

22.5.2 宿主概览 585

22.5.3 信道概览 585

22.5.4 同步方式、异步方式和单向方式调用 586

22.5.5 对象激活与对象创建 586

22.6 well-known对象的激活 586

22.7 客户端激活的对象 589

22.7.1 使用new关键字激活对象 591

22.7.2 潜在的问题 591

22.8 Factory设计模式和soapsuds.exe工具 591

22.8.1 Factory设计模式 591

22.8.2 soapsuds.exe工具 593

22.9 well-known和客户端激活的对象的生命周期 594

22.10 配置.NET Remoting 596

22.10.1 配置宿主 597

22.10.2 配置客户端 597

22.10.3 联合使用接口和配置文件 598

22.11 .NET Remoting服务器的部署 601

22.11.1 Windows服务 601

22.11.2 IIS 601

22.12 安全的.NET Remoting信道 602

22.12.1 安全的TCP信道 602

22.12.2 安全的HTTP信道 602

22.13 代理和消息 603

22.13.1 把方法调用转换成消息 603

22.13.2 IMessage接口的层次结构 604

22.13.3 透明代理、真实代理和ObjRef类 604

22.13.4 通过ObjRef类发布对象 605

22.13.5 消息接收器 606

22.13.6 为何考虑自定义真实代理 607

22.13.7 开发自定义真实代理 608

22.13.8 在类的所有实例上使用自定义真实代理 609

22.13.9 读写方法调用的参数 611

22.14 信道 612

22.14.1 简介 612

22.14.2 发送方信道和代理 613

22.14.3 接收方信道和服务器对象 613

22.14.4 消息接收器、格式化程序和信道 613

22.14.5 信道接收器提供程序 614

22.14.6 示例:显示网络消息的大小 614

22.15 .NET上下文 621

22.15.1 简介 621

22.15.2 上下文绑定和上下文灵活对象 621

22.15.3 上下文attribute和上下文属性 622

22.15.4 消息接收器区域 624

22.15.5 使用区域的示例 626

22.15.6 调用上下文 630

22.16 小结 631

22.16.1 激活对象的方式 631

22.16.2 截获消息 632

第23章 ASP.NET 2.0 633

23.1 简介 633

23.1.1 历史 633

23.1.2 ASP与ASP.NET 634

23.1.3 ASP.NET 1.x与ASP.NET 2.0 634

23.2 ASP.NET概览 634

23.2.1 Web Form 634

23.2.2 运行期的ASP.NET、IIS和Web应用程序 634

23.2.3 在你自己的.NET应用程序中承载ASP.NET 636

23.2.4 基于HTTP.SYS使用ASP.NET 637

23.3 ASP.NET应用程序的源代码 638

23.3.1 内联代码 638

23.3.2 服务器端脚本的代码段 639

23.3.3 代码隐藏 640

23.4 编译和部署模型 642

23.4.1 动态编译 642

23.4.2 就地预编译 643

23.4.3 部署预编译 643

23.5 Web Form和控件 644

23.5.1 服务器控件 644

23.5.2 客户端和服务器端之间的交互 645

23.5.3 视图状态 646

23.5.4 回发事件和非回发事件 648

23.5.5 控件状态 649

23.5.6 跨页面传递 650

23.5.7 HTML服务器控件与Web服务器控件 652

23.6 页面生命周期 653

23.7 ASP.NET应用程序配置 656

23.7.1 Web.Config文件的组织 656

23.7.2 Web.Config文件的部分 657

23.7.3 〈processModel〉部分 657

23.7.4 更新配置 658

23.7.5 在运行期应用配置更新 658

23.8 HTTP管线 658

23.8.1 简介 658

23.8.2 HttpApplication类和Global.asax文件 659

23.8.3 HTTP上下文 660

23.8.4 HTTP模块 660

23.8.5 HTTP处理程序 661

23.9 状态和会话管理 663

23.9.1 会话管理 664

23.9.2 处理会话标识符 666

23.9.3 会话存储的标准实现 666

23.9.4 为存储会话提供自定义实现 667

23.10 Provider设计模式 667

23.11 错误处理 668

23.11.1 〈system.Web〉配置元素和〈customErrors〉配置元素 668

23.11.2 Application Error事件 669

23.11.3 ErrorPage属性 669

23.12 跟踪、诊断以及事件管理 669

23.12.1 trace.axd HTTP处理程序 669

23.12.2 ASP.NET性能计数器 670

23.12.3 ASP.NET状态监视 670

23.13 输入数据的校验 671

23.13.1 校验控件 671

23.13.2 实现自定义校验 673

23.13.3 校验组 673

23.13.4 ValidationSummary类 674

23.14 用户控件 674

23.14.1 复合用户控件 676

23.14.2 用户控件事件 676

23.14.3 用户控件状态 677

23.14.4 用户控件与Visual Studio的设计时支持 679

23.15 缓存 679

23.15.1 页面缓存 679

23.15.2 缓存页面的多个版本 680

23.15.3 页面片段缓存 683

23.15.4 缓存后替换 684

23.15.5 数据缓存 684

23.15.6 缓存依赖 685

23.15.7 SQL Server缓存依赖 686

23.15.8 自定义缓存依赖 687

23.16 数据源 688

23.16.1 通过程序的方式绑定控件和数据源 688

23.16.2 声明式绑定控件和数据源 689

23.16.3 平铺数据源与层次数据源 690

23.16.4 ObjectDataSource类 690

23.16.5 利用数据源更新数据 691

23.17 查看并编辑数据 693

23.17.1 GridView控件 693

23.17.2 模板 696

23.17.3 DetailsView控件 698

23.17.4 FormView控件 700

23.17.5 显示XML数据 701

23.18 母版页 703

23.18.1 母版页和内容页面 703

23.18.2 嵌套母版页 704

23.18.3 配置母版页 705

23.18.4 从内容页面访问母版页 706

23.19 ASP.NET 2.0与本地化 707

23.20 站点导航 708

23.21 安全 710

23.21.1 通过IIS验证Windows用户 710

23.21.2 ASP.NET验证 712

23.21.3 表单验证提供程序 712

23.21.4 管理用户 713

23.21.5 管理角色 715

23.21.6 安全服务器控件 716

23.22 个性化与用户配置 717

23.22.1 配置提供程序以及用户数据的管理 717

23.22.2 匿名识别 718

23.22.3 个性化与会话 719

23.23 样式、主题与皮肤 719

23.23.1 CSS样式和控件 719

23.23.2 主题 720

23.23.3 皮肤 721

23.23.4 命名的皮肤 722

23.24 WebPart 722

23.24.1 创建包含WebPart的页面 724

23.24.2 设计方式 726

23.24.3 WebPart目录 727

23.24.4 编辑方式 728

23.24.5 连接WebPart 728

第24章 使用.NET进行Web服务开发 731

24.1 简介 731

24.1.1 SOA:面向服务架构 731

24.1.2 SOAP和WSDL 732

24.1.3 WS-I基本概要 732

24.1.4 消息交换模式 733

24.2 开发一个简单的Web服务 733

24.2.1 不使用Visual Studio开发一个简单的Web服务 733

24.2.2 使用Visual Studio开发一个简单的Web服务 735

24.3 测试与调试Web服务 735

24.3.1 测试Web服务 735

24.3.2 调试Web服务 736

24.4 创建Web服务的.NET客户端 736

24.4.1 不使用Visual Studio来创建Web服务的.NET客户端 736

24.4.2 使用Visual Studio创建Web服务的.NET客户端 738

24.5 异步调用与消息交换模式 739

24.6 通过.NET Remoting客户端使用Web服务 739

24.7 SOAP消息 740

24.7.1 简介 740

24.7.2 定义以及处理SOAP首部 741

24.7.3 对SOAP消息体编码 742

24.7.4 SOAP错误消息 743

24.7.5 SOAP与底层传输协议 743

24.8 Web服务契约与WSDL语言 743

24.8.1 WSDL能够表达什么 743

24.8.2 剖析WSDL文档 744

24.9 WSE与WS-*规范简介 746

24.9.1 WSE简介 746

24.9.2 WSE 3.0所支持的规范 747

24.9.3 安装WSE 747

24.9.4 WSE是如何利用SOAP扩展的 747

24.9.5 使用WSE诊断的第一个测试 748

24.10 WSE尚未支持的WS-*规范 748

24.10.1 WS-PolicyAttachment与WS-MetadataExchange 748

24.10.2 WS-ReliableMessage 748

24.10.3 UDDI and WS-Discovery 748

24.10.4 WS-Federation 749

24.10.5 WS-Coordination 749

24.10.6 WS-AtomicTransaction与WS-BusinessActivity 749

24.10.7 WS-Enumeration 750

24.10.8 WS-Eventing 750

24.10.9 WS-Management 750

24.11 WCF简介 750

附录A C#2.0的关键字 751

附录B .NET 2.0的新增功能 754

附录C 设计模式简介 762

附录D 针对.NET 2.0平台的工具 764