.NET 和 COM 之間的相互訪問
2024-07-10 12:59:20
供稿:網友
本文將介紹,如何在.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