COM组件与.Net组件的比较

1、COM组件与.Net组件的比较

 

     COM技术要早于.Net技术。COM定义了一个组件模型,在该模型中,组件可以使用不同的编程语言进行编写,其可以在本地进程中使用,也可以跨进程使用或者在网络上使用。.Net组件的目标也是这样,但这些目标的实现方式是不同于COM的实现方式的。.Net组件达到了与COM类似的目标,但是它引入了新概念,实现起来也更容易了。就目前而言,COM组件与.Net组件的互操作的基础还在于理解COM技术的实质。关于COM技术我们前三章已经讨论了,我们将不在详细探讨。我们将重点对这两个技术进行比较。

表 4-1 COM 与.Net对照表

项目

COM组件(C++)

DotNet组件(C#)

元数据

在COM中,组件的所有信息存储在类型库中(也就是我们前面使用的TLB文件)。类型库包含了接口,方法,参数以及UUID等。这些通过IDL语言来进行描述。

在.Net组件中,它的元数据可以通过定制特性来扩展,所以你可以不用了解IDL。

内存管理

通过引用计数方法来进行组件内存释放管理。(参见第三章)客户程序必须调用AddRef()和Release()来进行计数管理,但计数为0的时候,销毁组件。

通过垃圾收集器来自动完成。

接口

拥有三种类型的接口,即从IUnknown继承的定制接口,分发接口以及双重接口。接口通过QueryInterface函数查询,然后使用。

通过强制类型转换来使用不同的接口。

方法绑定

COM一般是早期绑定,采用虚拟表来实现;对于分发接口采用了后期绑定。

通过System.Reflecting实现后期绑定。

数据类型

在定制接口中,所有C++的类型可以用于COM;但是对于双重接口和分发接口,只能使用VARIANT,BSTR等自动兼容的数据类型。

采用了Object替代VARIANT,能使用C#的所有数据类型(用C#实现)。

组件注册

所有的组件必须进行注册。每个接口,组件都具有唯一的ID,包括CLSID和PROGID。

分为私有程序集和共享程序集。私有程序集能在一定程度上解决DLL版本冲突,重写等问题。共享程序集类似于COM。具体见参考文献[4]。

线程模式

使用单元模型,增加了实现难度,必须为不同的操作系统版本增加不同的单元类型。

通过System.Threading来进行处理,相对于COM的线程管理比较简单些。

错误处理

COM中通过实现HRESULT和ISupportErrorInfo接口,该接口提供了错误消息、帮助文件的链接、错误源,以及错误信息对象。

实现ISupportErrorInfo的对象会自动映射到详细的错误信息和一个.Net异常。

事件处理

通过实现连接点的接口IConnectionPoint和接口IConnectionPointContainer来实现事件处理.

通过event和delegate关键字提供事件处理机制。

2、.Net的编组问题

 

从DotNet传递给COM组件的数据必须转化为相应的表示方法,这个机制称为编组(marshaling)。对于在.Net和COM中有相同的表示方法的数据类型,不需要进行转换,比如,byte,short,int,long,double等;我们成这些数据类型为blittable数据类型。但是要记住,blittable数据类型中的数组必须是一维的。

对于VARAINT等Dotnet和COM没有相互对应的数据类型,需要进行编组转换;我们将这些类型称为non-blittable类型。具体类列表如下:

表 4-2 COM 与.Net数据类型转换对照表

COM数据类型

Dotnet数据类型

VARIANT

Object

SAFEARRAY

Array

BSTR

string

IUnknown*

Object

IDispatch*

Object

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值