原创  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


图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#代码

    // 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我: mountaintai@gmail.com

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

发表于 @ 2008年04月15日 23:47:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:perl使用多行string的语法 | 新一篇:windbg条件断点

  • 发表评论
  • 评论内容:
  •  
Copyright © mountaintaiII
Powered by CSDN Blog