c#2005net30高级编程(第5版)第23章COM的互操作性.doc
上传人:qw****27 上传时间:2024-09-12 格式:DOC 页数:39 大小:6MB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

c#2005net30高级编程(第5版)第23章COM的互操作性.doc

c#2005net30高级编程(第5版)第23章COM的互操作性.doc

预览

免费试读已结束,剩余 29 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第Ⅲ部分基类库第23章COM的互操作性230第章COM的互操作性如果您在学习.NET之前编写过Windows程序,通常没有时间和资源用.NET再重新编写以前的程序。有时重写代码有助于做一些修订,重新思考应用程序的体系架构,从长远来看,还有助于提高效率,更便于用新技术添加新特性。但是,我们不会为使用一种新技术而重写已有的代码。我们本来有数千行可运行的代码,重写它们需要的精力太多,还不如把它们迁移到托管的环境中。这也同样适用于Microsoft。在命名空间System.DirectoryService中,Microsoft并没有重新编写COM对象来访问有层次的数据存储,这个命名空间中的类实际上是访问ADSICOM对象的包装器。System.Data.OleDb命名空间也是这样,由这个命名空间中的类所使用的OLEDB提供程序包含相当复杂的COM接口。我们自己的解决方案也会面临相同的问题。如果在.NET应用程序中要使用已有的COM对象,或者要编写在旧COM客户程序中使用的.NET组件,就应使用本章介绍的COM互操作性。如果没有要与应用程序集成的COM组件,或旧COM客户程序要使用一些.NET组件,就应跳过本章。本章主要内容如下:COM和.NET技术在.NET应用程序中使用COM对象在COM客户程序中使用.NET组件调用本地方法的PlatformInvoke(平台调用)与其他章节一样,本章的示例代码也可以从Wrox网站www.wrox.com上下载。23.1.NET和COMCOM是.NET以前的技术。COM定义了一个组件模型,在该模型中,组件可以用不同的编程语言编写。用C++编写的组件可以在VB客户程序中使用。组件还可以在本地的进程中使用,跨进程使用或在网络上使用。看起来是不是很熟悉?当然,.NET的目标也是这样。但这些目标的实现方式是不同的。COM概念使用起来越来越复杂,已经不能扩展了。.NET达到了与COM类似的目标,但引入了新概念,实现起来更容易。即使到了今天,使用COM和.NET交互操作的主要问题是要理解COM。是COM客户程序使用.NET组件,还是.NET应用程序使用COM组件并不重要,而是必须理解COM。所以这里首先比较COM和.NET。如果您已经熟练掌握了COM技术,本节将是COM知识的复习。否则,您将学习到COM的概念——现在是使用.NET——我们不再需要在日常事务中处理它了。但是,在把COM技术集成到.NET应用程序中时,COM的问题仍旧存在。COM和.NET有许多类似的概念和不同的解决方案。下面将讨论:元数据释放内存接口方法绑定数据类型注册线程错误处理事件处理23.1.1元数据在COM中,组件的所有信息都存储在类型库中。类型库包含的信息有接口、方法和参数的名称和ID等。而在.NET中,所有这些信息都可以存储在程序集中,如第12章和第16章所述。COM存在的问题是,类型库是不能扩展的。在C++中,IDL(接口定义语言)文件用于描述接口和方法。其中一些IDL修饰符不在类型库中,因为VisualBasic(和负责开发类型库的VisualBasic小组)不能使用这些IDL修饰符。而在.NET中,不存在这个问题,因为.NET元数据可以使用定制特性来扩展。因此,一些COM组件有类型库,而其他COM组件没有。如果没有类型库可用,就可以使用C++头文件来描述接口和方法。在.NET中,使用带有类型库的COM组件是比较容易的,也可使用不带类型库的COM组件。在这种情况下,必须使用C#代码重新定义COM接口。23.1.2释放内存在.NET中,内存的释放是由垃圾收集器完成的。这完全不同于COM,COM依赖的是引用数。接口IUnknown是每个COM对象必须实现的一个接口,它提供了3个方法。其中两个方法与引用数有关。如果需要另一个接口指针,客户程序就必须调用方法AddRef(),这个方法会递增引用数。方法Release()会递减引用数,如果所得的引用数是0,就销毁对象,释放内存。23.1.3接口接口是COM的核心,它区分了在客户程序和对象之间使用的契约和实现方式。接口(契约)定义了由组件提供的方法,可以由客户程序使用。而在.NET中,接口也有非常重要的作用。COM有3种接口类型:定制接口、分派接口(dispatchinterface)和双重接口。1.定制接口定制接口派生自接口IUnknown。定制接口定义了虚拟表(vtable)中的方法顺序,所以客户程序可以直接访问接口的方法。这也表示在开发阶段客户程序需要知道虚拟表,因为方法的绑定是使用内存地址进行的。因此,定制接口不能由脚本客户程序使用。图23-1显示了定制接口IMath的虚拟表,除了接口