.NET 和 COM 之間的相互訪問

原文處處:http://dotnetextreme.com/articles/ccwrcw.html

翻譯整理:SLASH 51DOTNET 俱樂部


本文將介紹,如何在.NET 客戶端中來訪問COM 組件,以及在COM 客戶端中來訪問.NET 組件。
COM 的本質就是代碼之間的相互通信。在.NET 中代碼之間的相互通信並不是採用 COM 的形式 ,因此你無法直接在一個COM 的客戶端與 .NET 的組件進行通信。在這裏需要採用CCW (COM CALLABLE WRAPPER)來完成這樣的操作,CCW 在這裏作爲一個.NET 對象的代理,同樣的,假 如要在.NET 客戶端與 COM 組件來進行通信,需要利用RCW(RUNTIME CALLABLE WRAPPER)來充當這 樣一個代理。

COM 的客戶端與 .NET 的組件進行通信

   下面的範例講演示一個VB6 的客戶端利用CCW 訪問一個VB.NET 的組件

一個VB.NET 組件(testCCW.vb)

imports system
namespace CCWComponent
public class CCWClass
public function PassStr as string
PassStr = "Hi From .NET Component"
 end function
end class
end namespace 


將以上代碼存儲爲testCCW.vb文件,然後以如下語句進行編譯:

Vbc /t:library testCCW.vb

VBC 編譯器將會產生一個testCCW.DLL 文件,這是一個.NET 的 assembly,下一步爲testCCW.DLL 創建一個CCW 代理。regasm 工具能夠註冊一個.NET 組件,並生成一個供COM 客戶端來引用的 .TLB文件。
用如下語句:

Regasm testCCW.dll 

這將只在註冊表中註冊.NET 控件,這種方法應用於late binded 客戶端。
或者使用如下語句:

Regasm testCCW.dll /tlb:testCCW.tlb

這將會創建一個testCCW.tlb 文件,這種方法應用於early bingde 客戶端。

COM Client (VB6)
(late binded)

Private Sub Command1_Click()
dim o 
set o = createobject("CCWComponent.CCWClass")
msgbox o.PassStr
end sub 

同樣的客戶端也可以應用於early binded 客戶端,當然這需要在上一步輸出一個tbl文件,供 COM 客戶端來引用。需要強調的是,客戶端必須和它所要調用的.NET 組件在一個目錄下,或者 ,該組件存在於全局的 ASSEMBLY 緩存中。

使用RCW(RUNTIME CALLABLE WRAPPER)

下面的範例將介紹利用TLBImp 工具來創建一個COM 組件的代理,供.NET 客戶端來訪問。 COM 服務器 ComSrv.dll (MyCom.ComComponent)

向一個ACTIVEX DLL 中添加如下代碼:

Public Function SayHi() As String
 SayHi = "Hi From COM Component"
End Function 

組件編譯完成後用TLBImp 工具來創建一個代理:

Tlbimp ComSvr.dll /out c:/<Path> 

COM 組件的代理將在指定目錄中生成。

VB.NET 客戶端 (Ntest.vb)

imports system
imports microsoft.visualbasic
imports MyCom

class NTest
shared sub main
dim o as new MyCom.ComComponent
msgbox (o.sayHi)
end sub
end class 

保存爲Ntest.vb,然後編譯:

vbc /r:ComSvr.dll Ntest.vb

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章