第一部分 C#基础 2
第1章 .NET平台简介 2
1.1 .NET是什么 2
1.2 CLR 3
1.2.1 为什么CLR如此重要 3
1.2.2 CLR特性 4
1.2.3 CLR执行过程 4
1.3 .NET FCL 6
1.4 C#和其他.NET语言 7
1.5 CTS 7
1.6 CLS 7
1.7 小结 8
第2章 C#和Visual Studio 2008概述 9
2.1 编写一个简单的C#程序 9
2.2 创建一个VS2008项目 12
2.2.1 运行新项目向导 12
2.2.2 理解解决方案和项目 14
2.2.3 使用VS2008编写代码 15
2.2.4 生成和运行程序 16
2.2.5 设置编译器选项 18
2.3 注释代码 19
2.3.1 多行注释 19
2.3.2 单行注释 19
2.3.3 XML文档注释 19
2.4 标识符和关键字 21
2.4.1 标识符 21
2.4.2 关键字 22
2.5 约定和风格 22
2.6 变量和类型 23
2.6.1 变量 23
2.6.2 简单类型 24
2.7 明确赋值 27
2.8 与程序交互 28
2.8.1 与控制台屏幕通信 28
2.8.2 与命令行通信 28
2.8.3 VS2008中的命令行选项 28
2.8.4 从程序返回值 30
2.9 小结 30
第3章 编写C#表达式和语句 31
3.1 C#运算符 31
3.1.1 一元运算符 31
3.1.2 二元运算符 33
3.1.3 关系运算符 34
3.1.4 逻辑运算符 36
3.1.5 赋值运算符 38
3.1.6 三元运算符 38
3.1.7 其他运算符 39
3.2 语句 40
3.3 块和作用域 40
3.4 标签 41
3.5 运算符优先级和结合性 41
3.6 选择和循环语句 42
3.6.1 if语句 42
3.6.2 switch语句 44
3.6.3 C#循环 45
3.6.4 goto语句 48
3.6.5 break语句 49
3.6.6 continue语句 50
3.6.7 return语句 50
3.7 小结 51
第4章 理解引用类型和值类型 52
4.1 引用类型和值类型简介 52
4.2 统一类型系统 53
4.2.1 统一类型系统的工作原理 53
4.2.2 使用object进行通用编程 54
4.2.3 装箱和拆箱对性能的潜在影响 54
4.3 引用类型和值类型的内存分配 56
4.3.1 引用类型内存分配 57
4.3.2 值类型内存分配 58
4.4 引用类型和值类型赋值 58
4.4.1 引用类型赋值 58
4.4.2 值类型赋值 61
4.5 引用类型和值类型之间的更多区别 62
4.5.1 引用类型和值类型继承的区别 62
4.5.2 引用类型和值类型构建和终结的区别 62
4.5.3 引用类型和值类型对象大小的考虑 63
4.6 C#和.NET框架类型 63
4.6.1 C#别名和CTS 63
4.6.2 使用System.Guid 64
4.6.3 操作System.DateTime 65
4.7 可空类型 69
4.8 小结 70
第5章 操作字符串 71
5.1 C#字符串类型 71
5.1.1 格式化字符串 72
5.1.2 比较字符串 74
5.1.3 检查字符串是否相等 75
5.1.4 连接字符串 75
5.1.5 复制字符串 76
5.1.6 检查字符串内容 77
5.1.7 提取字符串信息 77
5.1.8 填充和移除字符串输出 78
5.1.9 更改字符串内容 79
5.1.10 分离和结合字符串 80
5.1.11 操作字符串字符 81
5.1.12 通过驻留池影响CLR的字符串处理 82
5.2 StringBuilder类 83
5.2.1 Append方法 83
5.2.2 AppendFormat方法 83
5.2.3 EnsureCapacity方法 84
5.2.4 ToString()方法 84
5.3 正则表达式 84
5.3.1 基本的正则表达式操作 85
5.3.2 深入了解正则表达式 85
5.3.3 练习正则表达式的应用程序 86
5.4 小结 88
第6章 数组和枚举 89
6.1 数组 89
6.1.1 一维数组 90
6.1.2 多维数组 91
6.1.3 交错数组 92
6.2 System.Array类 93
6.2.1 数组边界 93
6.2.2 搜索和排序 94
6.3 使用枚举类型 95
6.4 System.Enum结构 97
6.4.1 枚举类型、整型和字符串之间的转换 97
6.4.2 迭代枚举类型成员 98
6.4.3 其他System.Enum成员 98
6.5 小结 99
第7章 用Visual Studio 2008调试应用程序 100
7.1 单步调试代码 100
7.1.1 调试示例程序 100
7.1.2 设置断点 100
7.1.3 检查程序状态 101
7.1.4 单步调试代码 103
7.1.5 其他必备的调试命令 104
7.1.6 使用调试器找出程序错误 104
7.1.7 附加到进程 107
7.2 小结 109
第二部分 使用C#面向对象编程第8章 设计对象 112
8.1 对象成员 112
8.2 实例和静态成员 113
8.3 字段 113
8.3.1 常量字段 114
8.3.2 readonly字段 114
8.4 方法 114
8.5 属性 115
8.5.1 声明属性 115
8.5.2 使用属性 115
8.5.3 自动实现属性 116
8.5.4 VS2008属性代码段 116
8.6 索引器 116
8.7 回顾一下哪里适合使用分部类型 117
8.8 静态类 118
8.9 System.Object类 118
8.9.1 检查对象类型 118
8.9.2 比较引用 119
8.9.3 检查相等性 119
8.9.4 获得散列值 119
8.9.5 克隆对象 120
8.9.6 将对象作为字符串使用 120
8.10 小结 121
第9章 设计面向对象程序 122
9.1 继承 122
9.1.1 基类 123
9.1.2 调用基类成员 123
9.1.3 隐藏基类成员 124
9.1.4 版本控制 124
9.1.5 密封类 126
9.2 封装对象内部信息 127
9.2.1 数据隐藏 127
9.2.2 使用修饰符支持封装 127
9.2.3 用于对象的访问修饰符 130
9.2.4 包含和继承 130
9.3 多态 131
9.3.1 仔细查看多态解决的问题 131
9.3.2 使用多态来解决问题 133
9.3.3 属性多态 135
9.3.4 索引器多态 135
9.3.5 覆写System.Object类成员 136
9.4 小结 138
第10章 编写方法和自定义操作符 139
10.1 方法 139
10.1.1 定义方法 139
10.1.2 本地变量 140
10.1.3 方法参数 141
10.2 重载方法 146
10.3 操作符重载 147
10.3.1 用于自定义类型的算数操作符重载 147
10.3.2 自定义类型上的逻辑操作符重载 149
10.3.3 其他操作符重载技巧 150
10.4 转换和转换操作符重载 151
10.4.1 隐式转换与显式转换 151
10.4.2 自定义值类型转换操作符 154
10.4.3 自定义引用类型转换操作符 156
10.5 部分方法 157
10.6 扩展方法 158
10.7 小结 159
第11章 错误处理和异常处理 161
11.1 为什么需要异常处理 161
11.2 异常处理的语法:try/catch块的基础 162
11.3 使用finally块确保资源清理 163
11.4 处理异常 164
11.4.1 处理不同的异常类型 164
11.4.2 处理并传递异常 165
11.4.3 从异常中恢复 167
11.5 自定义异常 169
11.6 checked和unchecked语句 171
11.7 小结 173
第12章 使用委托和事件进行基于事件的编程 174
12.1 揭示委托 174
12.1.1 定义委托 175
12.1.2 创建委托的方法处理器 175
12.1.3 在委托上附加处理器 175
12.1.4 通过委托调用方法 176
12.1.5 使用委托实现多播 176
12.1.6 检查委托的相等性 178
12.2 实现委托推断 178
12.3 匿名方法 179
12.4 事件 180
12.4.1 定义事件处理程序 180
12.4.2 注册事件 181
12.4.3 实现事件 182
12.4.4 触发事件 184
12.4.5 修改事件的add/remove方法 186
12.5 小结 190
第13章 使用命名空间命名和组织类型 191
13.1 为什么需要命名空间 191
13.1.1 组织代码 192
13.1.2 避免命名冲突 192
13.2 命名空间指令 192
13.2.1 using指令 192
13.2.2 别名指令 193
13.3 创建命名空间 194
13.4 命名空间成员 197
13.5 作用域与可见性 197
13.6 命名空间别名修饰符 198
13.7 外部命名空间别名 199
13.8 小结 200
第14章 抽象类和接口 201
14.1 抽象类 201
14.2 抽象类与接口的不同 203
14.3 实现接口 203
14.4 定义接口类型 204
14.4.1 方法 204
14.4.2 属性 204
14.4.3 索引 205
14.4.4 事件 205
14.5 隐式实现接口 205
14.5.1 单个类的接口实现 205
14.5.2 模拟多态行为 208
14.6 显式实现接口 213
14.7 接口映射 217
14.8 接口继承 219
14.9 小结 221
第三部分 应用C#高级语言特性第15章 管理对象生命周期 224
15.1 对象初始化 224
15.1.1 实例构造函数 224
15.1.2 构造函数的重载 226
15.1.3 默认构造函数 227
15.1.4 私有构造函数 227
15.1.5 继承和实例化的顺序 228
15.1.6 静态构造函数 228
15.2 对象初始化器 229
15.3 对象终结器 229
15.4 自动内存管理 230
15.4.1 内存分配 230
15.4.2 垃圾收集器揭秘 231
15.4.3 GC优化 231
15.5 正确的资源清理方式 232
15.5.1 终结器带来的问题 233
15.5.2 Dispose模式 233
15.5.3 using语句 234
15.6 和垃圾收集器交互 235
15.7 小结 237
第16章 特性与反射 238
16.1 特性 238
16.1.1 使用特性 239
16.1.2 使用多个特性 239
16.2 特性参数 240
16.2.1 定位参数 240
16.2.2 命名参数 241
16.3 特性目标 241
16.4 创建自定义特性 242
16.5 反射 245
16.6 在特性上反射 251
16.6.1 动态创建代码 251
16.6.2 使用Reflection.Emit构建 253
16.7 小结 256
第17章 泛型与迭代器 257
17.1 非泛型集合 257
17.2 理解泛型的优点 258
17.2.1 泛型解决的问题 258
17.2.2 泛型是面向对象的 260
17.2.3 在数组、非泛型集合和泛型集合之间选择 261
17.3 构建泛型类型 262
17.3.1 使用泛型实现单链表 262
17.3.2 超越集合应用泛型 268
17.3.3 使用泛型定义类型 270
17.4 实现迭代器 273
17.4.1 GetEnumerator迭代器 273
17.4.2 方法迭代器 274
17.4.3 属性迭代器 275
17.4.4 索引迭代器 276
17.4.5 运算符迭代器 276
17.4.6 迭代器作为一个值的序列 277
17.4.7 销毁迭代器 278
17.5 小结 279
第18章 lambda表达式和表达式树 280
18.1 lambda表达式 280
18.1.1 lambda的语法 280
18.1.2 使用lambda 281
18.1.3 委托和lambda 282
18.2 表达式树 285
18.2.1 将lambda转换为表达式树 285
18.2.2 将表达式树转换为lambda 286
18.3 小结 286
第四部分 学习LINQ和.NET数据访问第19章 使用LINQ访问数据 288
19.1 LINQ to Objects 289
19.1.1 LINQ基本语法 289
19.1.2 提取投影 290
19.1.3 筛选数据 290
19.1.4 给查询结果排序 290
19.1.5 分组数据 291
19.1.6 联结数据 291
19.1.7 使用分组连接构建层次结构 291
19.2 使用LINQ to SQL查询关系数据 292
19.2.1 定义DataContext对象 292
19.2.2 通过DataContext查询 295
19.2.3 修改DataContext对象 295
19.2.4 调用存储过程 296
19.2.5 使用SQL函数 297
19.2.6 使用存储过程修改数据库 297
19.2.7 使用分部方法扩展数据处理逻辑 299
19.3 标准查询运算符 301
19.3.1 排序运算符 301
19.3.2 集合运算符 302
19.3.3 过滤操作符 303
19.3.4 量词操作符 304
19.3.5 投影操作符 304
19.3.6 分割操作符 305
19.3.7 联结操作符 305
19.3.8 分组操作符 306
19.3.9 产生操作符 307
19.3.10 相等操作符 307
19.3.11 元素操作符 308
19.3.12 转换操作符 308
19.3.13 连接操作符 309
19.3.14 聚集操作符 309
19.4 小结 310
第20章 使用ADO.NET管理数据 311
20.1 ADO.NET的架构 311
20.1.1 ADO.NET组件 311
20.1.2 连接和无连接模式 312
20.1.3 数据提供者 313
20.2 建立连接 314
20.3 查看数据 315
20.4 操作数据 317
20.4.1 插入数据 317
20.4.2 更新数据 318
20.4.3 删除数据 318
20.5 调用存储过程 319
20.6 使用无连接数据 319
20.6.1 读取数据到DataSet 319
20.6.2 将对DataSet的修改保存到数据库 320
20.7 LINQ to DataSet 323
20.7.1 使用DataTable作为数据源 323
20.7.2 强类型字段的访问 323
20.8 小结 324
第21章 操作XML数据 325
21.1 XML数据流 325
21.2 写XML 326
21.3 读取XML 327
21.4 使用XML DOM 328
21.4.1 使用XPathDocument读取XML 328
21.4.2 使用XmlDocument操作XML 329
21.5 使用LINQ to XML更容易地操作XML 329
21.5.1 LINQ to XML中的对象 330
21.5.2 创建XML文档 330
21.5.3 使用LINQ to XML操作命名空间 331
21.5.4 读取XML文档 331
21.5.5 查询XML文档 332
21.5.6 修改XML文档 332
21.6 小结 333
第22章 使用ADO.NET实体框架创建数据抽象 334
22.1 实体概览 334
22.2 使用VS2008创建实体数据模型 335
22.3 使用实体SQL查询实体 337
22.3.1 访问实体 337
22.3.2 查询实体 337
22.4 创建自定义实体 338
22.4.1 映射和架构 339
22.4.2 向模型中添加自定义实体 339
22.5 LINQ to Entities 342
22.5.1 查询实体 342
22.5.2 修改实体数据 342
22.6 小结 344
第23章 ADO.NET数据服务在云计算数据中的应用 345
23.1 在项目中添加ADO.NET数据服务 345
23.2 通过HTTP URL访问ADO.NET数据服务 346
23.2.1 查看实体集合 346
23.2.2 选择实体 346
23.2.3 筛选实体结果 348
23.2.4 给实体排序 349
23.2.5 跨越实体之间的关联 350
23.3 使用数据服务客户端库编写代码 351
23.3.1 创建客户端项目 351
23.3.2 使用WebDataQuery查询实体 351
23.3.3 添加实体 352
23.3.4 更新实体 352
23.3.5 删除实体 353
23.3.6 使用LINQ to Data Services查询实体 353
23.3.7 使用WebDataGen.exe生成类 354
23.4 小结 354
第五部分 创建桌面用户界面第24章 挖掘控制台应用程序极限 358
24.1 PasswordGenerator控制台应用程序介绍 358
24.2 与用户交互 359
24.3 处理命令行输入 360
24.4 设置控制台的颜色和位置 360
24.5 小结 362
第25章 编写Windows Forms应用程序 363
25.1 Windows Forms基础 363
25.2 VS2008对Windows Forms的支持 366
25.2.1 可视化设计环境 366
25.2.2 Windows Forms应用程序中的文件 366
25.2.3 可视化设计器如何工作 367
25.3 使用Windows Forms控件 372
25.4 MenuStrip、StatusStrip和ToolStrip控件 373
25.5 数据网格和数据绑定 375
25.5.1 建立数据绑定项目 375
25.5.2 绑定数据到ListBox控件 375
25.5.3 绑定数据到DataGridView控件 376
25.6 GDI+要素 377
25.6.1 Brush、Pen和Graphics对象 377
25.6.2 字体和绘制文本 378
25.7 附加窗体和对话框 379
25.7.1 模式和无模式对话框 379
25.7.2 窗体通信 380
25.7.3 通用对话框 381
25.8 小结 383
第26章 创建WPF应用程序 384
26.1 XAML就够了 384
26.1.1 介绍WPF应用程序 385
26.1.2 研究XAML 385
26.1.3 XAML中的控件 386
26.2 管理布局 387
26.2.1 控件对齐方式、尺寸和方框模型 387
26.2.2 Canvas布局 388
26.2.3 WrapPanel布局 389
26.2.4 StackPanel布局 389
26.2.5 UniformGrid布局 389
26.2.6 Grid布局 390
26.2.7 DockPanel布局 392
26.3 WPF控件 392
26.3.1 Border 393
26.3.2 Button 393
26.3.3 CheckBox控件 393
26.3.4 ComboBox控件 393
26.3.5 ContentControl控件 393
26.3.6 DockPanel控件 394
26.3.7 DocumentViewer控件 394
26.3.8 Ellipse控件 394
26.3.9 Expander控件 395
26.3.10 Frame控件 395
26.3.11 Grid控件 395
26.3.12 GridSplitter控件 395
26.3.13 GroupBox控件 396
26.3.14 Image控件 396
26.3.15 Label控件 396
26.3.16 ListBox控件 396
26.3.17 ListView控件 396
26.3.18 MediaElement控件 396
26.3.19 Menu控件 397
26.3.20 PasswordBox控件 397
26.3.21 ProgressBar控件 397
26.3.22 RadioButton控件 397
26.3.23 Rectangle控件 398
26.3.24 RichTextBox控件 398
26.3.25 ScrollBar控件 398
26.3.26 ScrollViewer控件 398
26.3.27 Separator控件 399
26.3.28 Slider控件 399
26.3.29 StackPanel控件 399
26.3.30 StatusBar控件 399
26.3.31 Tab控件 399
26.3.32 TextBlock控件 400
26.3.33 TextBox控件 400
26.3.34 ToolBar控件 400
26.3.35 ToolBarPanel控件 400
26.3.36 ToolBarTray控件 400
26.3.37 TreeView控件 401
26.3.38 UniformGrid控件 401
26.3.39 ViewBox控件 401
26.3.40 WindowsFormsHost控件 401
26.3.41 WrapPanel控件 402
26.4 事件处理 402
26.5 数据绑定 403
26.5.1 数据绑定概述 403
26.5.2 显示数据列表 403
26.6 使用样式 406
26.7 小结 407
第六部分 设计Web用户界面第27章 使用ASP.NET创建Web应用程序 410
27.1 Web应用程序模型 410
27.1.1 ASP.NET页面请求概述 410
27.1.2 C#代码驻留之地 411
27.1.3 可伸缩性和状态管理从何而来 411
27.1.4 如何理解直观性能 412
27.1.5 我为何使用ASP.NET 412
27.2 使用VS2008创建ASP.NET项目 412
27.3 ASP.NET页入门 413
27.3.1 Web窗体的构成 413
27.3.2 代码隐藏与页面生命周期 415
27.4 控件 417
27.4.1 服务器控件 417
27.4.2 HTML控件 418
27.5 状态管理 419
27.5.1 Application全局状态 419
27.5.2 在缓存中保存可更新信息 419
27.5.3 保存单一请求状态 420
27.5.4 发布Cookie 420
27.5.5 特定用户信息与Session状态 421
27.5.6 理解ViewState中的页面状态 421
27.5.7 页面重用与母版页和自定义控件 421
27.6 导航 424
27.6.1 用web.sitemap定义站点布局 425
27.6.2 Menu控件导航 425
27.6.3 实现TreeView 426
27.6.4 使用SiteMapPath添加面包屑导航 428
27.7 网站主题 428
27.7.1 设置主题 428
27.7.2 创建皮肤 428
27.7.3 创建样式表 430
27.8 网站安全 430
27.9 数据绑定 431
27.9.1 设置业务对象 431
27.9.2 简单数据绑定 432
27.9.3 ObjectDataSource与数据绑定 432
27.10 小结 434
第28章 用ASP.NET AJAX加强Web应用程序的交互性 435
28.1 何为AJAX 435
28.2 设置ASP.NET AJAX站点 436
28.3 AJAX页面生命周期 437
28.4 加载自定义脚本库 438
28.5 ASP.NET AJAX控件 439
28.5.1 UpdatePanel控件 439
28.5.2 UpdateProgress控件 440
28.5.3 Timer控件 441
28.6 通过JavaScript访问控件 441
28.6.1 使用JavaScript简化控件ID访问 442
28.6.2 访问已损坏的ASP.NET控件ID 443
28.7 通过ASP.NET AJAX调用Web服务 446
28.7.1 使用Web服务和AJAX的原因与取舍 446
28.7.2 使用AJAX和Web服务 447
28.8 小结 449
第29章 用Silverlight精心制作丰富的Web应用程序 451
29.1 什么让Silverlight运作 451
29.1.1 WPF与XAML从何而来 451
29.1.2 Silverlight如何与ASP.NET、JavaScript和AJAX关联 452
29.2 在VS2008中启动Silverlight项目 452
29.2.1 创建Silverlight项目 452
29.2.2 理解Silverlight项目的各个部分 453
29.3 用C#处理Silverlight事件 455
29.3.1 给Silverlight控件事件添加C#处理程序 456
29.3.2 在Silverlight中处理数据 456
29.4 媒体播放 458
29.4.1 给WebForm添加MediaPlayer 459
29.4.2 用C#操作MediaElement 459
29.5 动画UI组件 461
29.6 小结 462
第七部分 使用.NET技术通信第30章 使用.NET网络通信技术 464
30.1 实现套接字 464
30.1.1 套接字服务器 464
30.1.2 套接字客户端 467
30.2 与HTTP协作 470
30.3 执行FTP文件传输 471
30.3.1 将文件上载到FTP服务器 472
30.3.2 从FTP服务器获取文件 473
30.4 发送SMTP邮件 475
30.4.1 快速发送邮件的方法 475
30.4.2 发送带有附件的邮件 475
30.5 小结 476
第31章 创建Windows服务应用程序 477
31.1 在VS2008中创建Windows服务项目 477
31.1.1 运行Windows服务向导 477
31.1.2 检查Windows服务项目中的文件 477
31.2 编写Windows服务 480
31.2.1 可用的Windows服务方法覆写 480
31.2.2 实现Windows服务方法覆写 481
31.2.3 配置Windows服务 483
31.3 安装Windows服务 483
31.3.1 配置ServiceProcess-Installer 484
31.3.2 配置ServiceInstaller 484
31.3.3 部署Windows服务 485
31.4 创建一个控制器与Windows服务进行通信 485
31.5 小结 487
第32章 Remoting 488
32.1 基本的Remoting 488
32.1.1 Remoting服务器 489
32.1.2 Remoting客户端 491
32.1.3 Remoting安装 492
32.2 通道 496
32.3 生存期管理 498
32.4 小结 500
第33章 编写传统ASMX Web服务 501
33.1 Web服务基础 501
33.1.1 Web服务技术 501
33.1.2 一个基本的Web服务 502
33.1.3 查看Web服务信息 503
33.2 使用Web服务 506
33.3 小结 509
第34章 使用WCF创建Web服务 510
34.1 在VS2008中创建WCF应用程序 510
34.2 创建Web服务契约 511
34.2.1 创建WCF Web服务接口 512
34.2.2 声明ServiceContract特性 513
34.2.3 声明OperationContract特性 514
34.2.4 构建数据契约 514
34.3 实现Web服务逻辑 515
34.4 配置Web服务 517
34.4.1 service元素 518
34.4.2 endpoint元素 518
34.4.3 behavior元素 518
34.5 使用Web服务 519
34.6 创建服务引用 519
34.7 编写客户端代码调用Web服务 520
34.8 小结 521
第八部分 .NET应用程序架构设计示例第35章 使用Visual Studio 2008类设计器 524
35.1 可视化代码 524
35.1.1 开始查看对象 524
35.1.2 查看关联、继承和接口 527
35.2 使用类设计器创建对象模型 528
35.3 小结 532
第36章 C#中的设计模式样例 534
36.1 设计模式概览 534
36.2 迭代器模式 534
36.2.1 实现IEnumerable 535
36.2.2 实现IEnumerator 536
36.2.3 在客户代码中使用迭代器 539
36.2.4 foreach循环中的奇特行为 540
36.2.5 使用C#迭代器简化迭代器模式 543
36.3 实现代理模式 543
36.3.1 一个代理模式的例子 544
36.3.2 使用代理对象 546
36.4 实现模板模式 547
36.4.1 在.NET框架中模板模式是如何使用的 547
36.4.2 实现模板模式的一个例子 547
36.5 小结 551
第37章 创建N级/层系统 552
37.1 潜在的拖放问题 552
37.1.1 5分钟创建RAD应用程序 552
37.1.2 危害只是一丁点的生产力吗 553
37.2 N级/N层介绍 554
37.2.1 早期的应用程序架构 554
37.2.2 N层架构 554
37.2.3 N级架构 555
37.2.4 架构不应该过于理论 556
37.3 N层架构的示例 556
37.3.1 N层/一个程序集架构 556
37.3.2 N层/多个程序集架构 562
37.4 小结 564
第38章 使用WF自动化逻辑 565
38.1 开启工作流项目 565
38.2 创建顺序工作流 565
38.2.1 创建工作流 566
38.2.2 执行工作流 569
38.3 创建状态工作流 569
38.3.1 医院预约工作流概览 569
38.3.2 创建状态工作流 570
38.3.3 从主机向工作流通信:实现ExternalDataExchange-Service 571
38.3.4 处理状态工作流中的事件 575
38.4 小结 578
第九部分 体验更多的.NET框架类库第39章 进程和线程管理 580
39.1 .NET进程支持 580
39.1.1 启动新进程 581
39.1.2 使用已有进程 583
39.2 多线程概述 584
39.2.1 创建新线程 584
39.2.2 用更简洁的方式来运行线程中的代码 585
39.2.3 向线程传递参数 585
39.2.4 使用线程池 585
39.3 线程同步 586
39.3.1 C# lock语句 586
39.3.2 深入lock:Monitor类 587
39.3.3 平衡读取器线程和编写器线程间的访问 588
39.4 小结 589
第40章 本地化和国际化 590
40.1 资源文件 590
40.1.1 创建资源文件 590
40.1.2 编写资源文件 592
40.1.3 读取资源文件 593
40.1.4 转换资源文件 594
40.1.5 创建图形资源 595
40.2 多区域设置 599
40.2.1 实现多区域设置 599
40.2.2 查找资源 603
40.3 小结 604
第41章 互操作(P/Invoke和COM)与不安全代码 605
41.1 不安全代码 605
41.1.1 不安全代码是什么意思 606
41.1.2 指针的用途 606
41.1.3 sizeof()运算符 609
41.1.4 栈分配运算符 609
41.1.5 fixed语句 611
41.2 平台调用 613
41.3 .NET与COM通信 614
41.3.1 早绑定COM组件调用 614
41.3.2 晚绑定COM组件调用 616
41.4 将.NET组件作为COM组件 616
41.5 .NET对COM+服务的支持 618
41.5.1 事务 619
41.5.2 JIT激活 620
41.5.3 对象池 621
41.5.4 其他服务 621
41.6 小结 622
第42章 使用System.Diagnostics中的类型诊断应用 623
42.1 简单调试 624
42.2 条件调试 625
42.3 运行时跟踪 627
42.4 使用断言 628
42.5 访问内置的性能计数器 629
42.6 实现计时器 635
42.7 构建自定义性能计数器 636
42.8 使用采样分析性能 645
42.9 小结 653
第十部分 部署代码 656
第43章 程序集和版本控制 656
43.1 程序集内部构成 656
43.1.1 清单 657
43.1.2 特性 657
43.2 程序集功能 659
43.2.1 标识 659
43.2.2 范围 659
43.2.3 版本控制 659
43.2.4 安全性 660
43.3 配置 660
43.3.1 启动配置 661
43.3.2 运行时配置 661
43.4 部署 663
43.5 小结 663
第44章 代码安全 664
44.1 基于代码的安全 664
44.1.1 证据 664
44.1.2 权限 665
44.1.3 代码组 665
44.1.4 安全策略级别 666
44.1.5 权限请求 667
44.1.6 实现安全策略 669
44.2 基于角色的安全 671
44.3 安全实用工具 672
44.4 小结 673
第45章 创建Visual Studio 2008安装项目 674
45.1 运行VS2008安装项目向导程序 674
45.2 更多的安装配置 676
45.2.1 文件系统配置 677
45.2.2 创建注册表设置 677
45.2.3 文件类型 678
45.2.4 用户界面 678
45.2.5 启动条件 679
45.2.6 自定义操作 679
45.3 小结 680
第46章 部署桌面应用程序 681
46.1 通过ClickOnce部署 681
46.2 配置ClickOnce 683
46.3 小结 684
第47章 发布Web应用程序 685
47.1 剖析Web应用程序 685
47.2 Web服务器安装 685
47.3 虚拟目录安装 686
47.4 Web服务器部署 687
47.5 从VS2008中发布Web应用程序 688
47.6 小结 689
第十一部分 附录 692
附录A 编译程序 692
附录B 获取.NET框架帮助 694