COM Interop入門
[引子] 在C#程式設計師的字典中,COM Interop意味著在C#程式碼中,呼叫COM。由於COM一度擁有著廣泛的使用者,所以存在著很多COM元件。當開發者們遷徙到C#之後,如何重用這些COM元件,就是COM Interop要解決的問題。
[方法] 當手捧一個COM元件後,需要分三步完成一個最簡單的COM interop
- 使用tlbimp產生一個.net的dll模組(稱為Interop Assembly)
- 在C#程式碼中使用COM裡面的類(或介面)
- 在編譯的時候,引用(reference)在第1步中生成的dll
[例子] 手捧一個COM元件,可以用oleview一探究竟
可以看到COM元件裡面的CoClass,和Interface
圖1 oleview看COM
這裡我們看到CoClass Adder實現Interface IAdder, 其中有一個函式AddTwoNumber,輸入引數有2,一個[in],潛臺詞是呼叫者把值傳入,該函式不會(不能)修改這個變數;第二個引數是[OUT],潛臺詞是,呼叫者傳參的時候不需要考慮這個引數的值,該函式會為這個變數賦值。熟悉C++的看官肯定知道,這裡要指標或者引用出馬了。
第1步:TlbImp
這個操作會產生一個名為h2lib.dll。他是一個.net的dll,可以用ildasm或者reflector開啟。
圖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 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。
接下來大家可以執行test.exe,看看效果了。需要source code的同學可以mail我: mountaintai@gmail.com
今天的入門就到這裡,進階讀物可以閱讀這篇文章。是當年做COM Interop的PM寫的:)
相關文章
- 走近COM Interop——RCW入門
- 在 .NET Compact Framework 2.0 中使用 COM InteropFramework
- Composer 快速入門
- COM入門(轉載)
- SalesForce.com 入門教程Salesforce
- Docker Compose 快速入門Docker
- 在c#如何:使用 COM Interop 建立 Excel 電子表格C#Excel
- 如何獲得COM的Interop互動庫C#原始碼C#原始碼
- PIA (Primary Interop Assembly) & AIA (Alternate Interop Assembly)簡介AI
- 精讀《Function Component 入門》Function
- Prometheus入門 | Opensource.comPrometheus
- Apache Commons IO入門教程Apache
- PHP 之 Composer 新手入門指南PHP
- Azure Command Line (一)入門
- Web Components 入門例項教程Web
- OpenAI Chat completion API 入門指南OpenAIAPI
- java之使用CompletableFuture入門2Java
- FreeBSD Command Tools入門必看(轉)
- Docker從入門到精通(八)——Docker ComposeDocker
- SAP Commerce Cloud 專案 Spartacus 入門Cloud
- 華為開源專案ServiceComb快速入門
- csharp excel interop programmingCSharpExcel
- Jetpack Compose學習(1)——從登入頁開始入門Jetpack
- webpack -> vue Component 從入門到放棄(四)WebVue
- 推薦系統入門(Top-N recommendation)
- vue入門筆記體系(四)computed和watchVue筆記
- Docker基礎、Machine、Compose、Swarm入門與實踐DockerMacSwarm
- Composer - 快速入門(如有遺漏,敬請諒解)
- Android Compose 入門,深入底層原始碼分析Android原始碼
- Microsoft.Office.Interop.Word.Application wordApplication = new Microsoft.Office.Interop.Word.Application()報錯ROSAPP
- 入門入門入門 MySQL命名行MySql
- docker和docker compose安裝使用、入門進階案例Docker
- Svelte入門——Web Components實現跨框架元件複用Web框架元件
- Common Lisp入門筆記(一)7個基本運算子Lisp筆記
- comScore:功能手機扮演入門級手機的角色
- vue2.x版本中computed和watch的使用入門詳解-computed篇Vue
- 函數語言程式設計入門實踐 —— Compose/Pipe函數程式設計
- Docker極簡入門:使用Docker-Compose 搭建redis叢集DockerRedis