background image

.Net 下与传统 COM 和 ActiveX 的交互(原理与实践)

概要:本文主要说明在.net(C#)中是如何也传统的 COM 和 ActiveX 进行交互的。其中包
括:
1、 如何在.net 中使用传统的 COM 及 ActiveX?
2、 反之,如何让其它应用程序以传统的 COM 及 ActiveX 方式访问.net 对象?也就是如何

将.net 对象以 COM 及 ActiveX 的形式暴露给操作系统。

3、 一些开发概要和示例,以及开发示例代码。代码只做演示与测试,不涉及细节问题。

第 0 部份:COM 及 ActiveX 的简介

我不是 COM 高手,也不是 ActiveX 能人,对它们只是了解皮毛,所以为了防止读者对

文章中的一些说明出现理解的偏差,有必要先说明一下本人对 COM 和 ActiveX 的理解。简
单明了,COM 和 ActiveX 都是不同的应用程序可以公用的组件。 COM 没有界面,而
ActiveX 是有界面的。ActiveX 是特殊的 COM。因此,COM 所具有的功能,ActiveX 都有,
而 ActiveX 有更强大的功能及用户交界界面。本文不涉及 COM 及 ActiveX 的实现细节问题,
主要是介绍把.net 对象经 COM 的形式暴露给 OS 及其它应用程序的原理以及一些实现细节,
而并非 COM 的开发细节。

COM 是以组件的形式发布到目标机器上的,它可以被多个不同的应用程序公用。它是由

操作系统的一个 COM 运行环境管理的(个人理解)。类似于.net 运行环境,COM 的运行环
境负责整个 COM 的运行,从产生到结束。由于 COM 是 MS 在 windows 上较早的一个软件
开发模式,而且 COM 是基于二进制的组件,所以目前基本上所有的 windows 平台上都可
以使用 COM,也就是不用担心你开发的 COM 不能在其它机器上使用了。(再次说明,完全
是个人理解)

既然是操作系统管理 COM 的,当你开发一个 COM 时,必须让 OS 知道你开发的是什么

COM,如何使用等一些必须的信息。相关的有关于 COM 的 GUID

 

,注册等一些 常见的知识。

这里就不多说了。

我们所关心的问题之一是:当我的机上可以正常的使用 COM 时,如何让.net 平台来使

用传统的 COM,当然也包括 ActiveX.

第 1 部份:如何在.net(VS2003)下引用传统的 COM 及 ActiveX

这是一个很简单的问题,想必很多读者都使用过,而我也不准备在这块上说很多。你可

以通过引用,然后找到 COM 的注册文件,直接添加一个引用,然后像使用.net 的对象一样
使用经过引用后的 COM。如果它是一个 ActiveX,你还可以把它添加到工具栏上。当然,你
的目标对象必须是正确的 COM 或者 ActiveX。

那么经过引用后,它是如何工作的呢?其实我想讨论的,也就是传统的 COM 是如何

在.net 下工作的。看下面的图示(载自 MSDN)