第Ⅰ部分 概论 1
第1章 开发过程 1
1.1 组件开发 1
1.1.1 常见错误 2
1.1.2 项目管理风险 2
1.2 开发阶段 3
1.2.1 瀑布过程 4
1.2.2 初始需求中的问题 5
1.2.3 连续细化的过程 6
1.2.4 选择组件 7
1.2.5 购买第三方组件的风险 8
1.2.6 微软开发过程 9
1.3 分析阶段 9
1.3.2 错误的方法 10
1.3.1 编制预算的艺术 10
1.3.3 正确的方法 11
1.3.4 用例 12
1.3.5 交互图 12
1.4 设计阶段 13
1.4.1 熟悉最终用户 13
1.4.2 熟悉性能需求 14
1.4.3 从哪里开始 15
1.4.4 要完成什么 15
1.4.5 设计要具有可测试性 15
1.5 实现阶段 16
1.5.1 确保跟踪变化 17
1.5.2 编码原则 17
1.5.3 测试器 23
1.6 测试 23
1.6.3 验证测试 24
1.6.2 集成测试 24
1.6.1 单元测试 24
1.6.4 回归测试 25
1.6.5 确定在何时发布——故障恢复率和错误反馈率 25
1.7 部署阶段 26
1.8 部署后的日子:维护 26
1.9 小结 27
第2章 组件结构 28
2.1 Conway定律 28
2.2 父组件与子组件 29
2.3 组件的分级 31
2.3.1 大片还是小片 31
2.3.2 大小与复杂度 32
2.4 委托 34
2.5 用委托限定特性 35
2.6 聚集 37
2.7 深度聚集 38
2.8 线程 40
2.9 小结 41
第3章 组件设计 42
3.1 UML 42
3.1.1 类图 42
3.1.2 交互图 44
3.2 设计模式 45
3.2.1 创建型模式 47
3.2.2 结构型模式 50
3.2.3 行为模式 55
3.3 不要忘记-ilities 62
3.3.1 可操纵性 63
3.3.2 可测试性 63
3.3.3 可用性 63
3.3.4 可部署性 63
3.3.6 可靠性 64
3.3.5 可维护性 64
3.3.7 灵活性 66
3.3.8 可移植性 66
3.4 放松一下——没有完美的设计 67
3.5 优秀设计的标志 67
3.6 小结 67
第4章 组件分类 68
4.1 如何分类组件 69
4.1.1 形式方法问题 69
4.1.2 分类系统 71
4.2 前端组件 77
4.2.1 独立应用程序 77
4.2.2 分布式应用程序 77
4.2.3 基于浏览器的应用程序 80
4.3.2 服务器区 81
4.3.1 群集服务器 81
4.3 中间层 81
4.3.3 跟踪用户状态 82
4.3.4 数据库连接池 82
4.4 后端 83
4.5 小结 85
第5章 调试 86
5.1 几个关于调试的故事 86
5.2 常见的故障 87
5.3 不同种类的调试器 87
5.3.1 Visual Studio .NET集成调试器 88
5.3.2 DbgClr 88
5.3.3 CORDBG 89
5.4 一般的调试技术 89
5.4.1 断点 89
5.4.2 运行中修改代码 95
5.4.3 运行中修改数值 96
5.4.4 单步执行代码 97
5.4.5 测试数据 98
5.4.6 栈跟踪 99
5.4.7 调试多语言代码 100
5.5 检测代码 102
5.5.1 使用Debug类 102
5.5.2 使用Trace类 103
5.5.3 断言 104
5.5.4 使用Fail()方法 105
5.5.5 重定向调试和跟踪消息 106
5.5.6 条件编译 107
5.5.7 条件代码属性 109
5.6 调试情况的种类 110
5.7 几个通用的提示 110
5.9 DLL 111
5.8 独立应用程序 111
5.9.1 一般的问题 112
5.9.2 依附于过程 113
5.9.3 及时依附 115
5.9.4 从过程分离 116
5.10 小结 116
第6章 部署 117
6.1 旧方法 117
6.3.1 什么是程序集 118
6.2 新方法 118
6.3 程序集 118
6.3.2 程序集的结构 119
6.3.3 查看程序集数据 120
6.3.4 私有程序集 122
6.3.5 共享程序集 122
6.3.6 查看全局程序集高速缓存 122
6.5 使用安装向导 124
6.4 部署方法 124
6.6 创建基本的安装程序 126
6.6.1 添加项目输出组 127
6.6.2 编辑安装项目属性 128
6.6.3 常用内容 130
6.6.4 闪烁对话框 137
6.6.5 欢迎对话框 137
6.6.6 用户授权对话框 138
6.6.7 用户信息对话框 138
6.6.8 单选按钮对话框 140
6.6.9 复选框对话框 141
6.6.10 文本框对话框 142
6.6.11 安装文件夹对话框 143
6.6.12 自述文件对话框 143
6.6.13 注册用户对话框 144
6.6.14 使用条件 145
6.7 预编译代码 152
6.7.1 何时进行预编译 154
6.7.2 何时不进行预编译 154
6.8 在Internet和Intranet上部署软件 155
6.8.1 使用Web页 155
6.8.2 CAB文件 155
6.8.3 智能客户端 156
6.9 部署共享组件 157
6.10 许可 158
6.10.1 设计时许可 160
6.10.2 运行时许可 161
6.10.3 创建许可 161
6.10.4 使用经过许可的组件 162
6.11 小结 163
第7章 Windows窗体组件 164
7.1 Windows窗体 164
第Ⅱ部分 前端组件 164
7.2 设计ProcessViewer 166
7.3 开发ProcessViewer 168
7.3.1 获取进程数据 169
7.3.2 进程的排序 170
7.3.3 填充TreeView 171
7.3.4 为TreeView项设置位图 172
7.3.5 为菜单项设置位图 174
7.3.6 控制右边的窗格 179
7.3.7 限定窗体的尺寸 180
7.3.8 显示进程和模块的细目 181
7.3.9 访问命令行参数 183
7.3.10 使用正则表达式 184
7.3.11 获取操作系统的消息 188
7.3.13 获取环境变量 189
7.3.12 确定当前目录 189
7.3.14 确定是否有鼠标连接到系统中 191
7.3.15 确定用户的系统是否连接到网络上 192
7.3.16 获取逻辑驱动器的列表 192
7.3.17 使用文本文件 192
7.4 剪切、复制和粘贴 195
7.5 打印 196
7.6 ProcessViewer的完整代码 202
7.7 本地化 220
7.7.1 地区的指定 221
7.7.2 用程序实现改变地区 223
7.7.3 资源文件的本地化 224
7.7.4 窗体本地化 224
7.7.5 字符串的本地化 227
7.7.6 带有参数置换的短语 231
7.7.7 MyLocalizedForm的代码 232
7.7.9 使用ResEditor 234
7.7.8 图像的本地化 234
7.7.10 使用ResxGen 236
7.7.11 建立本地化的图像 236
7.8 小结 238
第8章 使用WebBrowser组件创建前端 239
8.1 微软的WebBrowser组件 239
8.2 设计MyWebBrowser 242
8.3 开发MyWebBrowser 243
8.4 引入WebBrowser ActiveX组件 243
8.4.1 简单的方法 243
8.4.2 困难的方法 244
8.4.3 运行时可调用的包装 246
8.4.4 添加工具栏 247
8.4.5 添加打印支持 248
8.4.6 添加导航支持 249
8.4.7 完整的代码 252
8.5 创建自定义的Web浏览器 256
8.5.1 引入并包装COM接口 258
8.5.2 IOleObject和IOleClientSite 258
8.5.3 使用ICustomDoc 260
8.5.4 IDocHostUIHandler 260
8.5.5 由通过COM接口调用的方法返回值 263
8.5.6 常见的自定义 264
8.5.7 IDocHostUIHandle方法详述 269
8.6 完整的代码 277
8.7 小结 285
第9章 自定义控件 286
9.1 过去的自定义控件 286
9.2 选择正确的基类 288
9.3 设计组件 288
9.3.2 更改控件的类名 290
9.3.1 创建自定义控件库 290
9.3.3 更改控件的Toolbox图标 291
9.3.4 向Toolbox添加组件 293
9.3.5 在稳定前向Toolbox添加组件 295
9.3.6 创建测试器 296
9.3.7 添加对测试器的引用 296
9.3.8 使用拖放来添加自定义控件 297
9.3.9 手工添加自定义控件 297
9.3.10 运行自定义控件的代码 298
9.4 组件的开发 299
9.4.1 添加鼠标事件处理程序 300
9.4.2 添加键盘事件处理程序 301
9.4.3 绘制控件 305
9.4.4 使用World变换 318
9.5 在文件系统中查找文件 326
9.6 添加上下文菜单 327
9.7 支持拖放 328
9.8 生成随机数 332
9.9 设计时属性 332
9.9.1 添加简单的属性 333
9.9.2 添加属性的说明 334
9.9.3 在属性窗口中禁止显示属性 334
9.9.4 非公共属性与属性窗口 334
9.9.5 在属性窗口中隐藏继承的属性 335
9.9.6 在类别下添加属性 335
9.9.7 禁止存储属性 336
9.9.8 属性编辑器 336
9.9.9 实现类型转换器 338
9.10 MyCustomControl的完整代码 340
9.11 小结 352
第10章 用户控件 353
10.1 用户控件与自定义控件 353
10.2 设计图形设计器组件 354
10.3 开发组件 357
10.3.1 创建用于设计器的组件 361
10.3.2 由MyComponent派生专用类 364
10.3.3 绘制Windows系统图标 365
10.3.4 显示和管理抓取句柄 367
10.3.5 用抓取句柄调整组件尺寸 374
10.3.6 用橡皮圈选择项 375
10.3.7 管理选择项 380
10.3.8 在屏幕上移动组件 380
10.3.9 设计器组件 382
10.3.10 添加和删除项 388
10.4 控制数据输入 389
10.4.1 在键入时检验键值 389
10.4.2 使用正则表达式验证 391
10.4.3 使用内置的方法 392
10.4.4 确认事件 394
10.5 小结 395
第11章 数据库前端 396
11.1 建立数据库连接 397
11.2 基于导航器的窗体 400
11.2.1 装载记录 404
11.2.2 导航记录集 407
11.2.3 插入新记录 408
11.2.4 删除记录 408
11.2.5 向数据库提交修改 409
11.2.6 取消对当前记录的编辑 409
11.2.7 取消所有编辑 410
11.3 Windows窗体中的数据绑定 410
11.3.1 把属性同数据源绑定 411
11.3.2 简单数据绑定 412
11.3.3 VS.NET提示 413
11.3.4 预览由数据适配器取出的行 418
11.3.5 完整源代码 419
11.4 基于网格的窗体 425
11.4.1 定制网格 428
11.4.2 数字、日期和时间格式 431
11.5 管理网格中的数据 434
11.5.1 装载记录 434
11.5.2 向数据库提交修改 436
11.5.3 回调所有的记录 438
11.5.4 使用默认值对行进行预填充 439
11.6 主-从窗体 445
11.6.1 创建窗体 446
11.6.2 窗体如何工作 449
11.6.3 使用嵌套行的主-从网格 458
11.7 数据库报表窗体 466
11.7.1 创建简单报表 466
11.7.2 创建一个更复杂的报表 473
11.8 小结 481
第12章 软件前端的一些技巧 482
12.1 显示一个闪烁窗口 482
12.2 管理用户的设置信息 484
12.2.1 特定的目录 485
12.2.2 应用二进制文件 486
12.2.3 应用文本文件 491
12.2.4 应用注册表 497
12.3 管理最近使用的文件 501
12.3.1 应用注册表 501
12.3.2 应用快捷方式 506
12.3.3 声明COM接口 509
12.3.4 使用COM方法读写字符串 520
12.3.5 COM对象ShellLink的一个包装器 520
12.3.6 应用FileShortcut类管理最近使用的文件列表 527
12.4 小结 529
第Ⅲ部分 中间层组件 530
第13章 Web窗体 530
13.1 ASP有什么缺陷 530
13.2 ASP.NET的改进之处 531
13.3 基础知识 532
13.3.1 告别包含文件,使用类 533
13.3.2 发布Web窗体 536
13.3.3 处理Web窗体事件 539
13.3.4 获取用户消息 545
13.4 一个Web应用程序的例子 547
13.5 设计Web应用程序 547
13.6 实现Web应用程序 548
13.6.1 PostBacks 556
13.6.2 添加事件处理程序 557
13.7 测试Web窗体 560
13.7.1 使用Response对象 564
13.7.2 使用重定向的方法返回全新的页面 565
13.7.3 使用跟踪状态 566
13.8 管理状态 570
13.8.1 使用cookies 571
13.8.2 使用隐藏数据 571
13.8.3 使用查询字符串 572
13.8.4 使用ViewState 573
13.8.5 使用对话变量 574
13.9 小结 577
第14章 Web控件 578
14.1 内置的Web控件 578
14.2 需要Web控件的原因 579
14.3 Web控件工作原理 580
14.4 开发一个定制的Web控件 580
14.6 开发Web控件 581
14.5 设计Web控件 581
14.6.1 定制发布 587
14.6.2 依赖浏览器的发布 588
14.6.3 添加定制事件 591
14.6.4 添加定制属性 593
14.6.5 MyWebControl控件的完整代码 594
14.6.6 移植控件到DLL中 595
14.6.7 创建测试装置 599
14.7 确认用户输入 600
14.7.1 指定显示出错信息的位置 603
14.7.2 Text属性和ErrorMessage属性的区别 603
14.7.3 RequiredFieldValidator组件 603
14.7.4 CompareValidator组件 603
14.7.5 RangeValidator组件 605
14.7.6 CustomValidator组件 606
14.7.7 ValidationSummary组件 608
14.7.8 RegularExpressionValidator组件 612
14.7.9 一个使用验证控件的完整例子 613
14.7.10 使用ValidationSummary组件的完整例子 617
14.8 小结 620
第15章 用户控件 621
15.1 什么是用户控件 621
15.2 基础知识 622
15.3 用用户控件创建Web应用程序 625
15.4 设计导航用户控件 626
15.5 开发导航 626
15.6 向Web窗体添加导航 628
15.7 建立图文框设置 628
15.8 开发内容用户控件 631
15.8.1 添加属性 634
15.8.2 添加事件处理程序 635
15.8.3 响应页面请求 635
15.9 建立HTML网页 639
15.8.4 把内容控件添加到Web窗体中 639
15.10 把Web窗体转换为用户控件 640
15.11 测试用户控件 641
15.12 把用户控件包装在DLL文件中 641
15.13 完整的代码 642
15.14 小结 651
第16章 服务 652
16.1 Web服务 652
16.2 基础知识 654
16.2.1 声明Web方法 656
16.2.2 数据输入和数据输出 657
16.2.3 支持强制类型转换 659
16.2.4 SOAP 659
16.2.5 WSDL 660
16.2.6 DISCO 664
16.2.7 UDDI 665
16.2.8 开发Web服务 666
16.2.9 测试Web服务 667
16.2.10 状态维护 674
16.2.11 安全性 677
16.2.12 发布动态搜索信息 677
16.2.13 将Web服务传送到专用机上 678
16.3 Windows服务 680
16.3.1 设计服务 683
16.3.2 开发服务 684
16.3.3 交互式服务 692
16.3.4 测试服务 693
16.3.5 添加系统托盘图标 696
16.3.6 添加服务控制程序 696
16.3.7 安装服务 707
16.3.8 自定义服务安装 710
16.3.9 最后几个注意事项 712
16.4 小结 713
第17章 安全性 714
17.1 Web应用程序的安全性 715
17.2 验证 715
17.2.1 基于IP地址的验证 715
17.2.2 通过凭证鉴定用户 718
17.2.3 其他方法 721
17.2.4 利用基本验证手段保护Web应用程序 721
17.3 ASP.NET的安全措施 731
17.3.1 假冒 731
17.3.2 窗体验证 733
17.3.3 一个简单的例子 734
17.3.4 将验证信息保存到数据库中 738
17.4 小结 740
17.3.5 护照验证 740
第Ⅳ部分 后端组件 741
第18章 ADO.NET体系结构 741
18.1 什么是后端 741
18.2 ADO.NET的主要要素 743
18.2.1 数据集 743
18.2.2 数据适配器 744
18.2.3 数据读取器 746
18.2.4 数据表 747
18.2.5 数据视图 747
18.2.6 数据绑定 751
18.3 连接到数据库 755
18.3.1 打开连接和断开连接 757
18.3.2 连接池 758
18.3.3 性能最大化 758
18.3.4 配置连接池 759
18.4.1 添加记录 760
18.4 更改数据库 760
18.4.2 更新记录 761
18.4.3 删除记录 762
18.4.4 处理数据集问题 763
18.4.5 使修改生效和对错误进行分析 765
18.5 一个完整的例子 769
18.6 小结 781
第19章 数据库Web服务 782
19.1 什么是数据库Web服务 782
19.2 设计服务 783
19.3 实现服务 784
19.4 为客户端提供Web方法 792
19.5 测试Web服务 795
19.5.1 使用Internal Web Browser进行测试 795
19.5.2 使用Windows应用程序进行测试 798
19.6 异常处理 803
19.7 事务处理 804
19.8 测试数据库Web服务 805
19.9 小结 806
第20章 多线程组件 807
20.1 线程的概念 807
20.1.1 单元线程 808
20.1.2 .NET线程与同步 809
20.1.3 给父线程回传信息 811
20.1.4 多个线程执行同一段代码 811
20.1.5 等待多个事件中的一个 812
20.1.6 线程和COM对象 814
20.1.7 无阻塞调用 815
20.1.8 线程池 817
20.2 线程管理 823
20.2.1 启动线程 823
20.2.2 检查线程的状态 824
20.2.3 线程的暂停与同步 825
20.2.4 恢复暂停的线程 831
20.2.5 停止线程 831
20.2.6 异步处理 833
20.2.7 同步处理 833
20.2.8 跨线程共享资源 835
20.2.9 从其他线程调用Windows窗体控件 836
20.3 创建多线程组件:StressTester 841
20.3.1 设计组件 842
20.3.2 实现组件 844
20.3.3 调试组件 849
20.4 小结 851
第21章 网关服务 852
21.1 什么是网关服务 852
21.2.1 基本的Remoting组件 853
21.2 Remoting Framework 853
21.2.2 一个简单的服务器端对象 854
21.2.3 从客户端访问远程对象 855
21.2.4 将客户端连接到服务器上 855
21.2.5 远程对象的激活模式 859
21.3 创建网关服务 862
21.3.1 建立系统的体系结构 863
21.3.2 设计网关服务 864
21.3.3 实现网关服务 866
21.3.4 设计服务主机应用程序 870
21.3.5 实现服务主机应用程序 871
21.3.6 设计服务提供者模拟器 875
21.3.7 实现服务提供者模拟器 877
21.3.8 测试MyGatewayService 883
21.3.9 将所有部分组装起来 886
21.3.10 处理远程异常 887
21.4 小结 888