NET和COM的互 *** 作性

NET和COM的互 *** 作性,第1张

NET和COM的互 *** 作性

一、概括
COM是NET以前的技术。COM定义了一个组件模型,在该模型中,组件可以用不同的编程语言编写。用 C++编写的组件可以在VB客户端中使用。组件还可以在本地的进程中使用,跨进程使用或跨网络使用。看起来是不是很熟悉?当然,NET的目标也是这样。但这些目标的实现方式不同。COM概念使用起来越来越复杂,且已经不能扩展了。NET实现了与 COM类似的目标,但引入了新概念,实现起来更容易。
使用 COM和.NET交互 *** 作的主要问题是要理解COM。是COM客户端使用NET组件,还是NET应用程序使用COM组件并不重要,而是必须理解COM。所以这里首先比较 COM和.NET的功能

二、元数据:
在COM中组件的所有信息都存储在类型库中。类型库包含的信息有接口、方法和参数的名称和ID等。而在NET中,所有这些信息都可以存储在程序集中,COM存在的问题是,类型库是不能扩展的。在C++中,IDL(Interface Definition Language,接口定义语言)文件用于描述接口和方法。其中一些IDL修饰符不在类型库中,因为Visual Basic(和负责开发类型库的Visual Basic小组)不能使用这些IDL修饰符。而在NET中,不存在这个问题,因为NET元数据可以使 自定义特性来扩展。
因此,一些COM组件有类型库,而其他COM组件没有。如果没有类型库可用,就可以使用C++头文件来描述接口和方法。在NET中,使用带有类型库的COM组件比较容易,也可使用不带类型库的COM组件。在这种情况下,必须使用C#码重新定义 COM接口。

三、释放内存:
在NET中,内存的释放由垃圾收集器完成。这完全不同于COM,COM依赖的是引用计数。
IUnknown接口是每个COM对象必须实现的一个接口,它提供了3个方法。其中两个方法与引用计数有关。如果需要另一个接口指针,客户端就必须调用AddRef()方法,这个方法会递增引用计数。Release()方法会递减引用计数,如果所得的引用计数是 0,就销毁对象,释放内存。

四、接口:
接口是COM的核心,它区分了在客户端和对象之间使用的契约和实现方式。接口定义了由组件提供的方法,可以由客户端使用。而在,NET中,接口也有非常重要的作用。
COM区分3种接口类型:自定义接口、调度接口和双重接口。
自定义接口:
自定义接口派生自IUnknown接口。因为自定义接口定义了虚拟表中方法的顺序,所以客户端可以直接访问接口的方法。这也表示在开发阶段客户端需要能识别虚拟表,因为方法的绑定使用内存地址进行。因此,自定义接口不能由脚本客户端使用,除了接口IUnknown接口的方法之外,该接口还提供了Add()和Sub()方法。

调度接口:

因为脚本客户端不支持自定义接口,所以需要另外一种接口类型,而在调度接口中,可用于客户端的接口总是IDispatch接口。IDispatch接口派生自IUnknown接口,除了接口 IUnknown接口的方法之外,它还提供了 4个方法,其中两个最重要的方法是 GetIDsOfNames()和Invoke()。在调度接口中需要两个表。第一个表把方法名或属性名映射到调度ID上,第二个表把调度ID映射到方法或属性的实现代码上。

双重接口:

可以想象,调度接口比自定义接口慢得多。另一方面,脚本客户端不能使用自定义接口。双重接口可以解决这个问题。双重接口派生自IDispatch接口,但提供了可以在虚拟表中直接使用的接口的方法。脚本客户端可以使用IDispatch接口调用Add()和Sub()方法,而能够识别虚拟表的客户端可以直接调用Add()和Sub()方法。

五、类型强制转换和QueryInterface:
如果NET类实现多个接口,就可以进行类型强制转换,得到一个接口或另一个接口。而在COM中, IUnknown接口通过 QueryInterface()方法提供了类似的机制。因为IUnknown接口是其他接口的基接口,所以可以以任何方式使用 QueryInterface()方法。

六、方法的绑定:
客户端映射方法的方式用术语早期绑定和后期绑定来定义。后期绑定表示要调用的方法是在运行期间确定的。NET使用System.Reflection名称空间来实现后期绑定
COM使用上面讨论的IDispatch接口进行后期绑定。后期绑定可以使用调度接口和双重接口来实现。
在 COM中,早期绑定有两个不同的选项。早期绑定的一种方式也称为虚拟表绑定,它直接使用虚拟表,这可以通过自定义接口和双重接口来实现。早期绑定的第二种方式也称为ID绑定。其中调度ID存储在客户端代码中,在运行期间只需要调用一次Invoke()方法。GetIDsOfNames()方法在设计期间调用。对于这种客户端,记住不必改变调度ID非常重要

七、数据类型:
对于双重接口和调度接口,COM能使用的数据类型局限于一个自动兼容的数据类型列表。IDispatch接口的Invoke方法接受VARIANT数据类型的数组。VARIANT是许多不同数据类型的联合,如 BYTE、SHORT、LONG、FLOAT、DOUBLE、BSTR、IUnknown、IDispatch等。VARIANT类型在Visual Basic中很容易使用,但它在C++中使用时就比较复杂。在NET中,使用Object代替VARIANT类型。
在自定义接口中,C++能使用的所有数据类型也可用于COM。但是,使用这个组件的客户端只 能采用某些编程语言

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/874781.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-13
下一篇2022-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存