国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

走近COM Interop——RCW入門

2024-07-21 02:17:11
字體:
來源:轉載
供稿:網友


走近com interop
—— rcw入門

緒言

由于目前加入了一個負責將原有系統移植至.net平臺的項目組,花了些時間對com-->.net進行了些基礎研究。貼出此文,希望與各位分享。不足之處,請各位指正。先謝啦。

一、基礎概念
什么是com interop?com interop看上去象是介乎于com和.net之間的一條紐帶,一座橋梁。為了保持向后兼容,com interop可以使得.net程序在不修改原有com組件的前提下方便的訪問com組件。這一點是非常重要的。事實上,全球的com組件的代碼量估計可能有數十億行,擁有這些com組件的公司不可能重寫這些組件,所以com interop的存在為有此需求的開發者提供了很好的解決方案。
大家都知道,com和.net之間存在著非常大的差異,為了使兩者可以有機的結合在一起進行協同工作,com interop中實際存在著2種橋接方式。一種是rcw,runtime callable wrapper(水平有限,不知道精確的翻譯是什么,這兒就不予詳解了。);另一種是ccw,com callable wrapper。后者,將在后續的相關文章中進行討論,這兒就不再贅述了,本文主要關注的是前者。rcw是在運行時通過clr從interop裝配件(interop assembly)的元數據中獲取相關信息動態的實例化而得到的。個人認為,可以把它理解為是介乎于com和.net應用程序之間的一個代理,.net應用程序對com組件的每個調用請求都是通過這個rcw中轉的。使用者將感覺不到自己是在調用com組件,一切都是這么的自然,和調用一個.net組件沒有任何區別。使用c++的朋友都知道,在c++中如果想要實例化一個com對象,需要使用cocreateinstance。而當我們有了rcw之后,一切都變得簡單,我們可以在c#中使用new來直接實例化這個com對象。
需要注意的是,一個com組件(指的是一個實例,即一個dll文件)由且僅由一個rcw負責維護。那么這兒有一個問題了,對于一個com組件的不同版本,是不是就會有不同的rcw與之相對應呢?答案是肯定的。那有些朋友會說,.net中的組件不是已經解決了com中的“dll hell”問題了嗎?按上面的說法,似乎并沒有得到解決嘛?這兒我要說的是,在.net中導入一個com組件的不同版本,是會出現此類問題。解決此類問題的方法是使用pia(primary interop assembly),這部分不在本文的討論范圍之內,我將在后續的相關文章中和大家進行討論。

二、實戰演練
.net提供三種途徑供我們導入一個com組件:
- 通過visual studio .net提從的“添加引用”功能
- 通過命令行方式——tlbimp.exe
- 使用system.runtime.interopservices.typelibconverter類編程實現導入功能
第一種方式無須贅述,非常的簡單。第三種方式我會說明pia的用法的同時,對此方法的使用加以說明。不過,我的水平不高,各位不要要求太高嘍。^_^ 言歸正傳,本文關注的是第二種方式。我們可以直接使用此工具提供的最簡單的調用方式:tlbimp testobj.dll。但需要提醒各位的是,如果我們使用這種方式導入一個com組件的話,我們將“犧牲”原有的com組件,這樣做是很危險的。個人認為,最簡單的調用方式是tlbimp testobj.dll /out:interop.testobjlib.dll。這樣,執行后將會產生一個名為interop.testobjlib.dll的com interop。下面將給出簡單的例子以說明整個過程。
1、首先用vb寫的一個簡單的activex dll
'project name is testobjlist, class name is testobj
option explicit

public function add(byval ivalue as integer) as integer
add = ivalue + 1
end function

2、使用命令行工具導入這個com組件
tlbimp testobjlib.dll /out:interop.testobjlib.dll

3、在一個.net windows forms中寫一段調用此組件的測試代碼
using interop.testobjlib;
private void button1_click(object sender, system.eventargs e)
{
testobjclass obj = new testobjclass();
int num = 1;
messagebox.show(obj.add(num).tostring());
}

此處需要說明一點,當tlbimp.exe在生成interop裝配件時會在原com中的類的名字后面加上一個"class"。調用時,請各位注意。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 仁怀市| 亳州市| 绩溪县| 蓬溪县| 富顺县| 通许县| 荥阳市| 错那县| 五河县| 楚雄市| 革吉县| 基隆市| 永安市| 漯河市| 射阳县| 泰顺县| 平顺县| 双桥区| 峡江县| 玉田县| 巧家县| 赣州市| 攀枝花市| 改则县| 西吉县| 缙云县| 梓潼县| 茂名市| 东源县| 县级市| 富源县| 彭山县| 保靖县| 涟源市| 平谷区| 诏安县| 巢湖市| 浦东新区| 白银市| 宁武县| 通河县|