COM Interop入门

[引子] 在C#程序员的字典中,COM Interop意味着在C#代码中,调用COM。由于COM一度拥有着广泛的使用者,所以存在着很多COM组件。当开发者们迁徙到C#之后,如何重用这些COM组件,就是COM Interop要解决的问题。

[方法] 当手捧一个COM组件后,需要分三步完成一个最简单的COM interop

  1. 使用tlbimp产生一个.net的dll模块(称为Interop Assembly)
  2. 在C#代码中使用COM里面的类(或接口)
  3. 在编译的时候,引用(reference)在第1步中生成的dll

[例子] 手捧一个COM组件,可以用oleview一探究竟

oleview h2 . dll

可以看到COM组件里面的CoClass,和Interface

COM Interop入门_第1张图片
图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

COM Interop入门_第2张图片
图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#代码

    // source code of test.cs
using  System;
using  H2Lib;

namespace  ComClient
{
    
class Program
    
{
        
static void Main()
        
{
            
int a = 2;
            AdderClass comServer 
= new AdderClass();
            comServer.AddTwoNumber(
4out a);
            Console.WriteLine(a);
        }

    }

}

 对该组件的调用在黄色部分高亮标明,和一般的C#类使用相比,并没有不同之处。

第三步:csc

编译的时候要引用第一步生成的dll。

csc test . cs  / r :H2lib . dll

接下来大家可以运行test.exe,看看效果了。需要source code的同学可以mail我: [email protected]

今天的入门就到这里,进阶读物可以阅读这篇文章。是当年做COM Interop的PM写的:)

 

你可能感兴趣的:(COM Interop入门)