天天看點

COM與.NET互動簡單示例

導讀:本文以VB6為例,主要介紹.NET引用COM和COM引用.NET的兩個簡單示例。

<1>.NET調用COM

為了簡單,我們使用VB6,這個據說即将開源的老古董,來制作一個簡單的COM。

在VB6中建立一個ActiveX dll工程,隻有一個類ComCalc.cls,代碼如下:

COM與.NET互動簡單示例

注意;設定相容性,并生成dll

COM與.NET互動簡單示例

然後 ,vs2010中建立一Console項目,微軟很奇怪,VB6中的project叫工程,自vs2002起又改名叫“項目”。添加對剛才建立的COM的引用

COM與.NET互動簡單示例
COM與.NET互動簡單示例

運作效果:

COM與.NET互動簡單示例

也許很多人會對這段c#代碼很好奇,這個_ComCalc是什麼時候産生的?為什麼通過它來調用方法,而不是通過類對象?

我們首先看一下,剛才引用COM後,VS IDE為我們做了什麼。

COM與.NET互動簡單示例

請注意,上圖中,Interop.SimpleComServer.dll是IDE為我們生成的一個叫“互操作程式集”的東東,而這個東東正是COM和.NET中間的橋梁。

通過對象視圖,我們看到_ComCalc正是在這個dll中生成的。我們可以通過OLEView.exe來察看這個Interop.SimpleComServer.dll的Typelib。

如果你已經裝全了VB6,你可以在VB目錄中找到OLEView.exe,并運作它。如果你沒有裝全,你可以運作vs2010自帶的OLEView.exe,位于

E:\Program Files\Microsoft SDKs\Windows\v7.0A\bin下

COM與.NET互動簡單示例
COM與.NET互動簡單示例

找到SimpleComServer,并輕按兩下

COM與.NET互動簡單示例

依據COM規則:COM用戶端與COM類進行互動的唯一方式是使用接口引用,而不是對象引用。

如果建立了基于C++的COM用戶端,需要特别關注對特定接口的查詢過程,如果接口不再被使用,一定要釋放它。

如果是VB6建立的用戶端,會自動擁有一個預設接口。

現在回到C#代碼中來,

_ComCalc itfComInterface = null ; // 定義COM接口

ComCalcClass comObj = new ComCalcClass(); // 定義COM類

itfComInterface = (_ComCalc)comObj; // 轉換為對COM接口的引用

Console.WriteLine( " COM server says 10 + 832 is {0} " ,itfComInterface.Add( 10 , 832 )); // 調用COM接口的方法

<2>COM調用.NET

記住,COM用戶端與COM類進行互動的唯一方式是使用接口引用,而不是對象引用。而.NET不需要任何接口。此時,我們必須確定每個公共成員公開成預設的接口。

我們需要設定[ClassInterface]特性,其屬性值可以為以下三個枚舉值之一:

AutoDual:訓示自動為類生成雙重類接口并向 COM 公開。 為該類接口生成類型資訊并在類型庫中釋出。 由于 ClassInterfaceAttribute 中描述的版本控制方面的限制,極力建議不要使用 AutoDual。

AutoDispatch:訓示該類隻支援 COM 用戶端的後期綁定。 在請求時,該類的 dispinterface 将自動向 COM 用戶端公開。 Tlbexp.exe(類型庫導出程式) 生成的類型庫不包含 dispinterface 的類型資訊,以防止用戶端緩存接口的 DISPID。 由于用戶端隻能後期綁定到接口,是以 dispinterface 不會出現 ClassInterfaceAttribute 中所述的版本控制問題。

這是 ClassInterfaceAttribute 的預設設定。

None:訓示不為類生成類接口。 如果未顯式實作任何接口,則該類将隻能通過 IDispatch 接口提供後期綁定通路。 這是 ClassInterfaceAttribute 的推薦設定。 要通過由類顯式實作的接口來公開功能,唯一的方法是使用 ClassInterfaceType.None。

詳見MSDN:(http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.classinterfacetype.aspx)

建立一vs2010項目。

COM與.NET互動簡單示例

注意:作為最佳實踐,應該将.NET程式部署到GAC。此時,需要一個SNK檔案以供簽名。如不部署到GAC,則需要複制到與COM應用程式相同的路徑下。

我們選擇GAC部署

COM與.NET互動簡單示例
COM與.NET互動簡單示例

部署成功!

下來我們需要生成必要的COM類庫。可以使用tlbexp.exe指令,當然,通過UI界面,也可以。

COM與.NET互動簡單示例

現在我們再用OLEView.exe來檢視

COM與.NET互動簡單示例

建立一Vb标準exe工程,并添加引用

COM與.NET互動簡單示例
COM與.NET互動簡單示例
COM與.NET互動簡單示例

源碼下載下傳

轉載于:https://www.cnblogs.com/downmoon/archive/2011/05/30/2063032.html