.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
概要:本文主要说明在.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
相关文章推荐
- .Net下与传统COM和ActiveX的交互(原理与实践)
- .Net下与传统COM和ActiveX的交互(原理与实践)
- .NET 与 COM 互操作原理
- .net 2.0 的 Bug?--与 COM 交互时发生奇怪的 InvalidCastException
- .Net调用Office Com组件的原理及问题检索com类工厂组件检索 COM 类工厂中 CLSID 为 {XXX} 的组件失败
- .Net2005开发与COM组件交互注意事项
- COM与.NET交互简单示例
- .net基础-COM与.NET交互
- .Net调用Office Com组件的原理及问题:检索com类工厂组件检索 COM 类工厂中 CLSID 为 {XXX} 的组件失败
- .Net魔法堂:史上最全的ActiveX开发教程——ActiveX与JS间交互篇
- C#数据库事务原理及实践(http://java.crazyasp.com/html/news/newsDetail.jsp?infoTitle.id=6443 )
- COM与.NET交互简单示例
- 从COM、.Net、JAVA三个方面讲述AE开发的最基本的原理。
- COM与.NET交互简单示例
- Windows Hook经验总结之四:COM组件Hook原理及实践
- Headfile !头文件的原理与实践编写。 摘自外网 -learn.cpp.com
- COM与.net的交互操作之在把.net注册成"COM"
- COM与.NET交互简单示例--追忆VB6
- .Net调用Office Com组件的原理及问题检索com类工厂组件检索 COM 类工厂中 CLSID 为 {XXX} 的组件失败
- 在ASP中调用传统的ActiveX DLL和调用基于.Net开发的 DLL