[引子] 在C#程序员的字典中,COM Interop意味着在C#代码中,调用COM。由于COM一度拥有着广泛的使用者,所以存在着很多COM组件。当开发者们迁徙到C#之后,如何重用这些COM组件,就是COM Interop要解决的问题。
[方法] 当手捧一个COM组件后,需要分三步完成一个最简单的COM interop
[例子] 手捧一个COM组件,可以用oleview一探究竟
oleview h2.dll可以看到COM组件里面的CoClass,和Interface
图1 oleview看COM
这里我们看到CoClass Adder实现Interface IAdder, 其中有一个函数AddTwoNumber,输入参数有2,一个[in],潜台词是调用者把值传入,该函数不会(不能)修改这个变量;第二个参数是[OUT],潜台词是,调用者传参的时候不需要考虑这个参数的值,该函数会为这个变量赋值。熟悉C++的看官肯定知道,这里要指针或者引用出马了。
第1步:TlbImp
tlbimp h2.dll这个操作会产生一个名为h2lib.dll。他是一个.net的dll,可以用ildasm或者reflector打开。
ildasm h2lib.dll
图2 ildasm看Interop Assembly
注意到class AdderClass中有一个函数AddTwoNumber: void(int32, int32&)。是的,这个函数就对应了我们在图1中看到的COM函数实现。之所以把这样的dll叫做Interop Assembly(IA)。道理也很直观。为了区别于native的dll(即动态连接库),我们用assembly代替之(虽然assembly也可以混淆为汇编语言,但是毕竟两者语境差的远了);为了说明这是为COM Interop服务的,所以前面加个定语Interop。顺便扯两句深入话题,这个IA里面只包含元数据(metadata),公共语言运行时(CLR)会用使用它产生RCW(Runtime Callable Wrapper)。//读者不用细究,我计划在将来的blog中把这个问题说说清楚。
第二步:C#代码
using System;
using H2Lib;
namespace ComClient
...{
class Program
...{
static void Main()
...{
int a = 2;
AdderClass comServer = new AdderClass();
comServer.AddTwoNumber(4, out a);
Console.WriteLine(a);
}
}
}对该组件的调用在黄色部分高亮标明,和一般的C#类使用相比,并没有不同之处。
第三步:csc
编译的时候要引用第一步生成的dll。
csc test.cs /r:H2lib.dll接下来大家可以运行test.exe,看看效果了。需要source code的同学可以mail我: mountaintai@gmail.com
今天的入门就到这里,进阶读物可以阅读这篇文章。是当年做COM Interop的PM写的:)
发表于 @ 2008年04月15日 23:47:00 | 评论( loading... ) | 举报| 收藏