第1章 互操作功能的重要性 1
1.1 Visual Basic .NET概述 1
1.2 迁移方案 2
1.2.1 VB6和Visual Basic .NET的不兼容之处 2
1.2.2 迁移到Visual Basic .NET的好方案 5
1.2.3 坏的迁移情况 5
1.2.4 不能迁移的情况 6
1.2.5 互操作性的含义 6
1.3 设计互操作方案 6
1.3.1 Web服务 7
1.3.2 智能型客户端 7
1.3.3 新的ASP.NET前端 7
1.3.4 扩充原有的组件 8
1.3.5 分布式数据处理 8
1.4 互操作应用的主要范围 8
1.4.1 在.NET中调用COM组件 8
1.4.2 在COM中调用.NET组件 9
1.4.3 在新旧程序间共享数据访问 9
1.4.4 共享配置信息 9
1.4.5 使用静态入口点调用非COM的DLL 9
1.5 小结 10
第2章 在.NET中使用COM组件 11
2.1 创建COM组件 11
2.1.1 构建COM组件 12
2.1.2 二进制兼容性 22
2.2 导入COM组件 23
2.2.1 在设计阶段导入COM组件 24
2.2.2 动态导入 37
2.3 使用COM组件 38
2.3.1 早期绑定 39
2.3.2 后期绑定 44
2.3.3 对象的生存期 48
2.3.4 多重接口 50
2.3.5 继承性 53
2.3.6 在.NET中检查COM组件 55
2.4 小结 62
第3章 在COM中使用,NET程序集 63
3.1 创建.NET程序集 63
3.1.1 创建.NET程序集概述 63
3.1.2 对互操作进行设置 75
3.1.3 使用Com Class()属性 75
3.1.4 手工提供类 77
3.2 在COM中注册.NET程序集 85
3.2.1 使用Visual Studio .NET 86
3.2.2 使用命令行实用程序 89
3.3 在COM和Windows中使用NET对象 92
3.3.1 早期绑定 93
3.3.2 后期绑定 98
3.3.3 处理销定的文件 100
3.3.4 对象生存期 100
3.3.5 多重接口和默认接口 102
3.3.6 在COM中检查.NET程序集 106
3.4 小结 109
第4章 从.NET调用MTS和COM+中的COM组件 110
4.1 使用COM+组件 111
4.1.1 创建COM+组件 111
4.1.2 在Visual Basic .NET中调用COM+组件 124
4.1.3 排队组件 132
4.2 传输数据 140
4.2.1 使用AD0中的Recordset对象 141
4.2.2 使用变量数组 146
4.2.3 使用XML文档 148
4.3 在VB6中调用COM+中的.NET组件 155
4.3.1 在.NET中创建CoM+组件 156
4.3.2 使类可用于COM客户程序 162
4.4 小结 163
第5章 COM+中的Visual Basic.NET和COM 164
5.1 COM+和VB6 165
5.1.1 为COM+创建Active XDLL 165
5.1.2 在COM+中注册DLL 170
5.1.3 创建VB6测试程序 173
5.2 COM+和Visual Basic .NET 173
5.2.1 在COM+中注册DLL 178
5.2.2 创建Visual Basic .NET测试程序 180
5.3 从COM+中的Visual Basic .NET中调用VB6组件 182
5.4 从COM+内的VB6中调用Visual Basic .NET组件 185
5.5 小结 188
第6章 定制编组 190
6.1 四种不同的编组方法 191
6.1.1 第一种编组方法:使用Tlbimp.exe 191
6.1.2 第二种编组类型(简单数据类型编组):将属性添加到使用标推类型的接口中 192
6.1.3 第三种编组类型:对COM和.NET之间传递的自定义数据结构进行编组 193
6.1.4 第四种编组类型:实现ICustomMarshaler接口 194
6.2 性能问题 195
6.3 第二种编组类型 196
6.3.1 Ildasm 196
6.3.2 Ilasm 197
6.3.3 使用带有第二种编组类型的Ildasm或者Ilasm 198
6.4 第三种编组类型 207
6.5 第四种编组类型 221
6.6 托管代码到非托管代码 233
6.7 小结 233
第7章 线程问题 235
7.1 线程的基础知识 235
7.1.1 线程的复杂性 236
7.1.2 使用单线程与多线程 237
7.1.3 VB6中的线程 238
7.1.4 Visual Basic .NET中的线程 239
7.2 线程之间的互操作 240
7.2.1 在.NET中调用COM 240
7.2.2 在COM中调用.NET 253
7.3 小结 254
第8章 DCOM、远程处理和Web服务 255
8.1 XML Web服务 255
8.2 .NET远程处理 256
8.3 DCOM 256
8.4 XML Web服务和互操作 257
8.4.1 从.NET中调用COM 258
8.4.2 从COM中调用.NET 263
8.5 .NET远程处理和互操作 268
8.5.1 从.NET中调用COM 269
8.5.2 从COM中调用.NET 277
8.6 小结 281
第9章 共享配置信息 283
9.1 专用的INI文件 284
9.1.1 INI文件的结构 284
9.1.2 访问VB6中的INI文件 285
9.1.3 访问Visual Basic .NET中的INI文件 287
9.2 使用Windows注册表存储配置设置 289
9.3 基于XML的配置文件 291
9.3.1 访问带有.NET Framework类的XML配置信息 292
9.3.2 使用Visual Basic .NET中的System.XML访问设置信息 293
9.3.3 使用VB6中的MSXML访问设置 296
9.4 并行性问题 298
9.5 小结 298
第10章 .NET中的平面文件访问 299
10.1 对于平面文件的随机访问 299
10.1.1 VB6中的随机访问 300
10.1.2 Visual Basic .NET中的随机访问 303
10.2 平面文件的二进制访问 307
10.2.1 VB6中的二进制访问 307
10.2.2 Visual Basic .NET中的二进制访问 310
10.3 顺序的文件访问 312
10.3.1 VB6中的顺序访问 312
10.3.2 Visual Basic .NET中的顺序访问 314
10.4 作为Visual Basic .NET中替代方案的流 315
10.4.1 使用流技术的顺序访问 315
10.4.2 使用流技术的二进制访问 316
10.5 小结 318
第11章 在.NET中使用ADO 319
11.1 AD0和ADO .NET之间的比较 319
11.1.1 AD0优点和缺点 320
11.1.2 在.NET中何时仍然需要ADO 320
11.2 在.NET中使用ADO 322
11.2.1 Visual Basic .NET中的ADO代码 323
11.2.2 数据绑定限制 324
11.2.3 将一些AD0属性设置为字符串而引发的问题 324
11.2.4 将ADO Recordset转换为ADO.NET DataSet 326
11.3 DA0和RD0的意义 327
11.4 小结 329
第12章 在.NET中调用APl或静态DLL函数 330
12.1 .NET对使用带有静态入口点的DLL的需求在减少 330
12.1.1 对访问Windows API的需求减少 330
12.1.2 较旧代码的退休 333
12.2 平台调用服务 334
12.2.1 声明APl 334
12.2.2 调用API函数 335
12.2.3 给函数指定别名 335
12.2.4 将结构作为参数传递 336
12.2.5 数据编组问题 338
12.3 更多的控制 340
12.3.1 控制数据编组 340
12.3.2 使用DLLImport而不是Declare 341
12.4 性能因素 342
12.5 小结 342
第13章 .NET中ActiveX控件的互操作性 343
13.1 何时在.NET中使用ActiveX控件 343
13.2 Windows Forms控件和ActiveX控件之间的差异 344
13.3 在.NET中驻留ActiveX控件 345
13.3.1 示例--Windows Media Player控件 346
13.3.2 关于示例的注意事项 347
13.3.3 从Properties列表中移出的Custom属性 347
13.3.4 使用Aximp.exe创建包装器 347
13.3.5 导入VB6 UserControls 348
13.3.6 不能导入的控件 348
13.3.7 安全性 348
13.4 VB6中的.NET Windows Forms控件 349
13.5 小结 349
第14章 VB6代码迁移的准备工作 350
14.1 停止使用默认的属性和方法 350
14.2 避免数组的非零下界 351
14.3 让所有的参数显式地传值或引用(ByRef或By3Val) 351
14.4 将默认值放在所有可选的参数上 352
14.5 在独立的代码行上声明所有变量 352
14.6 注意声明变量的位置 352
14.7 避免UDT中的固定长度字符串 353
14.8 清除已作废的关键字 354
14.9 删除隐式对象实例化 355
14.10 停止隐式加载窗体 356
14.11 将数据绑定转换到ADO 357
14.12 尽可能使用固有的常量 357
14.13 停止编写DHTML页面和WebClass 357
14.14 包装API调用 358
14.15 从UI中得到逻辑并放入组件和类中 358
14.16 避免后期绑定 358
14.17 小结 359