走近COM Interop
—— RCW入门
绪言
由于目前加入了一个负责将原有系统移植至.Net平台的项目组,花了些时间对COM-->.Net进行了些基础研究。贴出此文,希望与各位分享。不足之处,请各位指正。先谢啦。
一、基础概念
什么是COM Interop?COM Interop看上去象是介乎于COM和.Net之间的一条纽带,一座桥梁。为了保持向后兼容,COM Interop可以使得.Net程序在不修改原有COM组件的前提下方便的访问COM组件。这一点是非常重要的。事实上,全球的COM组件的代码量估计可能有数十亿行,拥有这些COM组件的公司不可能重写这些组件,所以COM Interop的存在为有此需求的开发者提供了很好的解决方案。
大家都知道,COM和.NET之间存在着非常大的差异,为了使两者可以有机的结合在一起进行协同工作,COM Interop中实际存在着2种桥接方式。一种是RCW,Runtime Callable Wrapper(水平有限,不知道精确的翻译是什么,这儿就不予详解了。);另一种是CCW,COM Callable Wrapper。后者,将在后续的相关文章中进行讨论,这儿就不再赘述了,本文主要关注的是前者。RCW是在运行时通过CLR从Interop装配件(Interop Assembly)的元数据中获取相关信息动态的实例化而得到的。个人认为,可以把它理解为是介乎于COM和.Net应用程序之间的一个代理,.Net应用程序对COM组件的每个调用请求都是通过这个RCW中转的。使用者将感觉不到自己是在调用COM组件,一切都是这么的自然,和调用一个.Net组件没有任何区别。使用C++的朋友都知道,在C++中如果想要实例化一个COM对象,需要使用CoCreateInstance。而当我们有了RCW之后,一切都变得简单,我们可以在C#中使用new来直接实例化这个COM对象。
需要注意的是,一个COM组件(指的是一个实例,即一个DLL文件) 由且仅由一个RCW负责维护。那么这儿有一个问题了,对于一个COM组件的不同版本,是不是就会有不同的RCW与之相对应呢?答案是肯定的。那有些朋友会说,.Net中的组件不是已经解决了COM中的“DLL HELL”问题了吗?按上面的说法,似乎并没有得到解决嘛?这儿我要说的是,在.Net中导入一个COM组件的不同版本,是会出现此类问题。解决此类问题的方法是使用PIA(Primary Interop Assembly),这部分不在本文的讨论范围之内,我将在后续的相关文章中和大家进行讨论。
二、实战演练
.Net提供三种途径供我们导入一个COM组件:
- 通过Visual Studio .Net提从的“添加引用”功能
- 通过命令行方式——TLBIMP.EXE
- 使用System.Runtime.InteropServices.TypeLibConverter类编程实现导入功能
第一种方式无须赘述,非常的简单。第三种方式我会说明PIA的用法的同时,对此方法的使用加以说明。不过,我的水平不高,各位不要要求太高喽。^_^ 言归正传,本文关注的是第二种方式。我们可以直接使用此工具提供的最简单的调用方式:TLBIMP TestObj.dll。但需要提醒各位的是,如果我们使用这种方式导入一个COM组件的话,我们将“牺牲”原有的COM组件,这样做是很危险的。个人认为,最简单的调用方式是TLBIMP TestObj.dll /out:interop.TestObjLib.dll。这样,执行后将会产生一个名为interop.TestObjLib.dll的COM Interop。下面将给出简单的例子以说明整个过程。
1、首先用VB写的一个简单的ActiveX Dll
'Project name is TestObjList, class name is TestObj
Option Explicit
Public Function Add(ByVal iValue As Integer) As Integer
Add = iValue + 1
End Function
2、使用命令行工具导入这个COM组件
TLBIMP TestObjLib.dll /out:interop.TestObjLib.dll
3、在一个.Net Windows Forms中写一段调用此组件的测试代码
using interop.TestObjLib;
private void button1_Click(object sender, System.EventArgs e)
{
TestObjClass obj = new TestObjClass();
int num = 1;
MessageBox.Show(obj.Add(num).ToString());
}
此处需要说明一点,当TLBIMP.EXE在生成Interop装配件时会在原COM中的类的名字后面加上一个"Class"。调用时,请各位注意。
分享到:
相关推荐
本主题将深入探讨PInvoke、C++ Interop和COM Interop这三种主要的.NET互操作方式。 1. **PInvoke(Platform Invoke)** PInvoke是.NET Framework提供的一个特性,用于调用非托管DLL中的函数。它通过在托管代码中...
《精通.NET互操作:p/invoke, c++ interop和COM interop》这本书深入探讨了.NET框架中的三种主要互操作技术,即平台调用(P/Invoke)、C++互操作(C++ Interop,也称为StructLayoutAttribute)以及组件对象模型(COM...
COM Interop,全称为Component Object Model Interop,是.NET Framework提供的一种机制,使得.NET应用程序能够与非托管(通常是COM)组件进行交互。COM是微软在90年代推出的一种组件技术,广泛应用于各种Windows应用...
《精通.NET互操作:pinvoke, c++ interop和COM interop》这本书深入探讨了.NET框架下不同语言和组件之间的交互技术。源代码包含了书中提到的示例,旨在帮助读者更好地理解和应用这些技术。以下是对这些关键技术的...
这部分的示例代码叫做ComP6srcDNet中的ComP5工程,呵呵,有点眼熟吧,其实我的目的只是想介绍.net部分,所以COM和MFC部分引自杨老师的“COM 组件设计与应用(七)——编译、注册、调用” ,只有Use_Net的代码是我写...
因此我將我理解的語意,按照原文的排版方式,重新整理了一遍,方便我日後閱讀,如果你也是對Com Interop有興趣,建議你購買原文書回來參照,我想這樣會讓你在學習Com Interop的過程中更容易上手。
标题提及的技术点主要涉及两个方面:一是使用.NET 2.0平台下的COM Interop组件来开发统计报表,二是如何在IIS 6.0服务器上发布并处理权限问题。以下是对这两个主题的详细解释: 1. 使用COM Interop组件开发统计报表...
副标题: P/Invoke,C++ Interop和COM Interop 作者: 黄际洲 / 崔晓源 出版社: 人民邮电出版社 出版年: 2009-5 页数: 419 定价: 68.00元 装帧: 平装 ISBN: 9787115204349 内容简介 · · · · · · ...
《精通.NET互操作:P/Invoke,C++ Interop和COM Interop》 因为此书太大,所以分为7部分下载;每部分可单独使用,为RAR压缩文件解压后为PDF版。因为第二部分和第六部分太大以后有权限了上传。 共分为:七部分 当前是:...
这两个文件是.NET Framework下的Interop(互操作性)库,用于使.NET应用程序能够与非托管代码,即COM组件进行交互。 首先,让我们详细了解"Interop"的概念。在.NET环境中,Interop服务允许.NET应用程序调用COM...
4. **生成元数据(Metadata)**:通过在项目属性中启用“生成COM互操作类型库”(Register for COM Interop),Visual Studio会在编译时自动生成TLB(Type Library)文件,它是COM组件的元数据。 注册COM组件: 1. ...
在Office 2010 Interop中,WPF应用通过COM Interop调用Office的COM组件,例如Word.Application和Excel.Application。 2. **Interop Assemblies**: .NET Framework提供了预生成的Interop装配,这些装配(如Microsoft...
1. **Interop Services**: 在.NET框架中,Interop Services允许.NET应用程序与非托管代码交互,如COM组件。这种交互是通过P/Invoke(Platform Invoke)和COM Interop实现的。 2. **SAPI (Speech Application ...
【Interop互操作】是.NET Framework提供的一种机制,使得托管代码(在CLR控制下运行的代码)能够与非托管代码(不在CLR控制下运行的代码,如COM组件、Win32 API等)进行交互。互操作性是.NET Framework的重要特性,...
使用托管语言调用Native dll必备,写的很细致,可以作为字典来查的。
【】39726e13ca4b5de8ba86bb891513915b【】公共语言运行库(CLR)开发系列课程(1):Pinvoke简介【】公共语言运行库(CLR)开发系列课程(2):Pinvoke进阶【】公共语言运行库(CLR)开发系列课程(3):COMInterop基础【】公共...
.NET COM Interop是一种技术,允许.NET Framework应用程序与旧版的COM(组件对象模型)组件进行交互。这在处理遗留代码或使用非托管库时尤其有用。在标题".NET COM Interop使用Postbuild"中,提到的“后期编译”是指...
Com组件的一些例程
Microsoft.Office.Interop.Excel,简称Excel Interop,是.NET Framework的一部分,它提供了一种称为COM Interop(Component Object Model Interop)的技术,使得.NET代码可以调用COM组件,如Excel应用程序。...