ch23COM的互操作性.doc

  1. 1、本文档共38页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ch23COM的互操作性

第Ⅲ部分 基 类 库 第23章 COM的互操作性 PAGE 728 PAGE 729 230 第 章 COM的互操作性 如果您在学习.NET之前编写过Windows程序,通常没有时间和资源用.NET再重新编写以前的程序。有时重写代码有助于做一些修订,重新思考应用程序的体系架构,从长远来看,还有助于提高效率,更便于用新技术添加新特性。但是,我们不会为使用一种新技术而重写已有的代码。我们本来有数千行可运行的代码,重写它们需要的精力太多,还不如把它们迁移到托管的环境中。 这也同样适用于Microsoft。在命名空间System.DirectoryService中,Microsoft并没有重新编写COM对象来访问有层次的数据存储,这个命名空间中的类实际上是访问ADSI COM对象的包装器。System.Data.OleDb命名空间也是这样,由这个命名空间中的类所使用的OLE DB提供程序包含相当复杂的COM接口。 我们自己的解决方案也会面临相同的问题。如果在.NET应用程序中要使用已有的COM对象,或者要编写在旧COM客户程序中使用的.NET组件,就应使用本章介绍的COM互操作性。 如果没有要与应用程序集成的COM组件,或旧COM客户程序要使用一些.NET组件,就应跳过本章。 本章主要内容如下: COM和.NET技术 在.NET应用程序中使用COM对象 在COM客户程序中使用.NET组件 调用本地方法的Platform Invoke(平台调用) 与其他章节一样,本章的示例代码也可以从Wrox网站上下载。 23.1 .NET和COM COM是.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修饰符不在类型库中,因为Visual Basic(和负责开发类型库的Visual Basic小组)不能使用这些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种接口类型:定制接口、分派接口(dispatch interface)和双重接口。 1. 定制接口 定制接口派生自接口IUnknown。定制接口定义了虚拟表(vtable)中的方法顺序,所以客户程序可以直接访问接口的方法。这也表示在开发阶段客户程序需要知道虚拟表,因为方法的绑定是使用内存地址进行的。因此,定制接口

文档评论(0)

153****9595 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档