您的位置:首页 > 其它

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

2007-01-22 17:05 369 查看
.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)

 

using System;
using System.Runtime.InteropServices;

namespace Webb.PublicCOM.TestCOM01
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;

// Add in these using clauses for this example
using System.Runtime.InteropServices;
using System.Text;
using System.Reflection;
using Microsoft.Win32;

namespace Webb.PublicCOM.TestCOM01

编译,然而用Active Control Test Container 来测试和查看我们的ActiveX:

 



可以看到,经过特殊方法实现后的对象可以在ActiveX中查看的到,而且可以添加到容器中:



接下来的工作就是一些功能的实现细节问题了,本文暂时不讨论这些内容。

最后一个问题就是在其它语言中通过COM来访问我们的.net对象,我们在C++下经过测试并实现了一些细节问题,事件等。但源代码不在示例中。

总结:.net开发COM或者ActiveX,其实是把写好的.net对象(当然是准备暴露给OS的),实现一些特殊的接口,通过工具把元数据导出成COM可用的组件库数据,然后注册给OS。运行时,通过CCW来动态的管理与维护.net对象。而对于用户来说,他就像访问COM一样访问.net对象。

MSDN参考:

http://msdn2.microsoft.com/zh-cn/library/8bwh56xe(VS.80).aspx

http://msdn2.microsoft.com/zh-cn/library/e753eftz(vs.80).aspx

下载文档:

1、 VS2003COM开发插件。

http://files.cnblogs.com/WuCountry/CSComSetup.zip

2、 示例项目代码。
http://files.cnblogs.com/WuCountry/Webb.PublicCOM.zip

3、 本文doc文档。
http://files.cnblogs.com/WuCountry/TempDoc.zip
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: