導讀:本文以VB6為例,主要介紹.NET引用COM和COM引用.NET的兩個簡單示例。
<1>.NET調用COM
為了簡單,我們使用VB6,這個據說即将開源的老古董,來制作一個簡單的COM。
在VB6中建立一個ActiveX dll工程,隻有一個類ComCalc.cls,代碼如下:

注意;設定相容性,并生成dll
然後 ,vs2010中建立一Console項目,微軟很奇怪,VB6中的project叫工程,自vs2002起又改名叫“項目”。添加對剛才建立的COM的引用
運作效果:
也許很多人會對這段c#代碼很好奇,這個_ComCalc是什麼時候産生的?為什麼通過它來調用方法,而不是通過類對象?
我們首先看一下,剛才引用COM後,VS IDE為我們做了什麼。
請注意,上圖中,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下
找到SimpleComServer,并輕按兩下
依據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項目。
注意:作為最佳實踐,應該将.NET程式部署到GAC。此時,需要一個SNK檔案以供簽名。如不部署到GAC,則需要複制到與COM應用程式相同的路徑下。
我們選擇GAC部署
部署成功!
下來我們需要生成必要的COM類庫。可以使用tlbexp.exe指令,當然,通過UI界面,也可以。
現在我們再用OLEView.exe來檢視
建立一Vb标準exe工程,并添加引用
源碼下載下傳
轉載于:https://www.cnblogs.com/downmoon/archive/2011/05/30/2063032.html