• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

        走近COM Interop——RCW基礎

        走近COM Interop——RCW基礎

        更新時間:2019-05-30 文章作者:未知 信息來源:網絡 閱讀次數:

        走近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"。調用時,請各位注意。

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統下載排行

        主站蜘蛛池模板: 男女交性无遮挡免费视频| 114一级毛片免费| 亚洲高清视频免费| 丁香花在线观看免费观看| 久久久久久亚洲精品无码| 亚洲午夜无码AV毛片久久| 国产精品免费AV片在线观看| 亚洲性69影院在线观看| 亚洲av无码专区在线观看素人| 国产日韩一区二区三免费高清| 亚洲人6666成人观看| 久久精品国产亚洲7777| 久久久久久免费视频| 一级做a爱片特黄在线观看免费看| 亚洲资源在线观看| xvideos亚洲永久网址| 四虎最新永久免费视频| 九九免费久久这里有精品23| 亚洲成AV人片久久| 亚洲精品无码mv在线观看网站| 青春禁区视频在线观看直播免费 | 亚洲精品国产成人99久久| 天天看片天天爽_免费播放| 国产一区二区三区免费观看在线| 亚洲国产成人久久精品软件 | 国产乱子伦精品免费女| 99久热只有精品视频免费看| 老外毛片免费视频播放| 亚洲一级毛片中文字幕| 精品亚洲综合在线第一区| 国产精品国产免费无码专区不卡 | 亚洲中文字幕无码专区| 妞干网在线免费观看| 日本高清高色视频免费| 一级看片免费视频囗交| 无码色偷偷亚洲国内自拍| 亚洲伊人色一综合网| 久久精品国产精品亚洲色婷婷| 狠狠色婷婷狠狠狠亚洲综合| 日韩免费电影在线观看| 最近最新MV在线观看免费高清|