.NET和COM互操作性

内容来自《C#高级编程》第7版

.NET和COM互操作性

  • .NET和COM
    • 元数据
    • 释放内存
    • 接口
    • 自定义接口

.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有许多类似的概念和使用它们的不同解决方案。下面将讨论:

  • 元数据
  • 释放内存
  • 接口
  • 方法绑定
  • 数据类型
  • 注册
  • 线程
  • 错误处理
  • 事件处理

下面几节讨论这些概念和编组机制。

元数据

在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依赖的是引用计数。
IUnknow接口是每个COM对象必须实现的一个接口,它提供了3个方法。其中两个方法与引用计数有关。如果需要另一个接口指针,客户端就必须调用AddRef()方法,这个方法会递增引用计数。Release()方法会递减引用计数,如果所得的引用计数是0,就销毁对象,释放内存。

接口

接口是COM的核心,它区分了在客户端和对象之间使用的契约和实现方式。接口(协定)定义了由组件提供的方法,可以由客户端使用。而在.NET中,接口也有非常重要的作用。
COM区分3种接口类型:自定义接口、调度接口(dispatch interface)和双重接口。

自定义接口

自定义接口派生自IUnknown接口。因为自定义接口定义了虚拟表(vtable)中方法的顺序,所以客户端可以直接访问接口的方法。这也表示在开发阶段客户端需要能识别虚拟表,因为方法的绑定使用内存

你可能感兴趣的:(C#,COM,c#)