COM Interop入門

mountaintaiII發表於2008-04-15

[引子] 在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寫的:)

 

相關文章