.NET程序调用win32COM原理

来源:互联网 发布:苏州大禹网络 知乎 编辑:程序博客网 时间:2024/05/01 11:43

.NET程序调用win32COM原理

1.NETCOM

.NET应用程序是不能直接调用win32COM的,应为他们分属两个不同执行平台,其实现机理是不一样的。具体的说,COM使用了标准化的接口,通过接口,客户机可以和组件类进行对话。COM实现了跨语言的二进制级别的代码重用,它的运行时需要注册表和COM运行时支撑的。.NET组件将自己形成一个完整的描述,并保存到组件文件一个特殊的段中,称作清单(manifest)。使用这个组件时,只需将文件复制到应用程序目录,宿主则从该组件文件的清单中获取相应信息,实现组件创建。

2、如何使用COM

前一小节说了,.NET是不能直接调用COM的,中间必须得有一个转换器支持才行,这种转换器即是使用包装的类和代理的类实现。包装的类把依附于另一个体系结构的类包围起来,从而为不能识别被包装类原有接口的客户提供一个本机接口。同样的,客户可以使用代理组件去访问依附于不同体系结构的组件或在外地的组件。下面从静态调用和动态调用两个层面分别说明。

 

静态调用COM

 

在静态调用中,我们一般会通过VS.NET IDE添加COM引用,然后实例化COM类,使用其属性和方法。在这之中发生了什么呢?

VS.NET IDE 在使用添加引用对话框查找COM DLL,并把COMDLL添加到COM引用的列表中,IDE创建名称空间与原来的COM组件有同样的名称,由COM组件提供的类就放在该名称空间中。这样,就可以使用与引用、实例化和调用如C#固有对象相同语法来创建一个引用,并实例化和调用COM对象的包装。在这个过程中,VS.NET IDE自动为COM生成一个代理组件,并将COM文件副本放到工程目录中。以后,.NET程序和COMDE 交互实际上是和COM代理程序的交互了。这个代理组件就是.NET RCW(runtime callable wrapper),应为RCW是属于.NET的一部分,符合.NET平台规范,因此,.NET程序和RCW进行交互就很自然的进行了。当然,这个代理DLL可以由tlbimp.exe程序生成,我们可以添加对刚生成的组件代理添加引用。

 

动态调用COM

 

动态调用也称为后期绑定,通常是以普通的数据类型引用对象,并依赖运行时动态地确定方法和变量的地址,具有一定的浮复杂性。后期绑定是通过.NET反射机制实现的,当在.NET程序中对COM对象进行后期绑定是,不需要为COM组件创建RCW代理,而是需要在Type类上调用GetTypeFromProgID方法来创建一个表示COM类的实例,这个实例代表了该COM类类型,然后我们就可以创建该类类型的实例了,也就是创建COM实例了。创建工作是通过把Type对象传递给Activator类的CreateInstance方法完成,并返回COM实例,可以把后期绑定的实例保存在object应用中。接下来就是调用COM方法和属性了,遗憾的是,.NET不能直接在object上使用COM方法,而需要依赖于Type对象的InvokeMemberf方法,传入必须的object数组参数。

 

一下是一般流程实例为代码:

Using System.Runtime.InteropServices;

 

Type objtype;

Object objComInst;

Objtype = Type.gettypefromgrogid(progid”);

objComInst = activator.createinstance(objtype);

objtype.invokemember(…);

原创粉丝点击