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

首頁 > 學院 > 開發(fā)設計 > 正文

COM Interop 理論與實踐

2019-11-17 05:25:02
字體:
來源:轉載
供稿:網(wǎng)友
 COM interop理論/實踐在.NET框架下,開發(fā)人員可以通過COM interop tools 將COM組件導入導一個應用中去,一旦導入成功,那么我么就可以非常輕易地調用COM接口給我們所提供的方法了。A .NET Framework developer can incorporate COM components into a managed application by using COM interop tools to import the relevant COM types. Once imported, the COM types are ready to use.一、COM interop 概述:COM Interop看上去象是介乎于COM和.Net之間的一條紐帶,一座橋梁。為了保持向后兼容,COM Interop可以使得.Net程序在不修改原有COM組件的前提下方便的訪問COM組件。這一點是非常重要的。事實上,全球的COM組件的代碼量估計可能有數(shù)十億行,擁有這些COM組件的公司不可能重寫這些組件,所以COM Interop的存在為有此需求的開發(fā)者提供了很好的解決方案。COM和.NET之間存在著非常大的差異,為了使兩者可以有機的結合在一起進行協(xié)同工作,COM Interop中實際存在著2種橋接方式。一種是RCW,Runtime Callable Wrapper;另一種是CCW,COM Callable Wrapper。RCW是在運行時通過CLR從Interop裝配件(Interop Assembly)的元數(shù)據(jù)中獲取相關信息動態(tài)的實例化而得到的。使用者將感覺不到自己是在調用COM組件,一切都是這么的自然,和調用一個.Net組件沒有任何區(qū)別。  需要注重的是,一個COM組件(指的是一個實例,即一個DLL文件)由且僅由一個RCW負責維護。那么這兒有一個問題了,對于一個COM組件的不同版本,是不是就會有不同的RCW與之相對應呢?答案是肯定的。那有些朋友會說,.Net中的組件不是已經(jīng)解決了COM中的“DLL HELL”問題了嗎?按上面的說法,似乎并沒有得到解決嘛?這兒我要說的是,在.Net中導入一個COM組件的不同版本,是會出現(xiàn)此類問題。解決此類問題的方法是使用PIA(PRimary Interop Assembly)。.Net提供三種方法來導入一個COM組件l         通過Visual Studio .Net提從的“添加引用”功能l         通過tlbimp.exe實現(xiàn)l         使用System.Runtime.InteropServices.TypeLibConverter類編程下面就分別介紹COM的封裝、HRESULTs and Exceptions、繼續(xù)、聚合和包容、如何運用COM interop來生成發(fā)出事件和處理事件以及System.Runtime.InteropServices命名空間幾個重要的概念1.        COM的封裝(COM Wrappers)l         在一般的語言(諸如C++)當中在客戶端我們一定要控制該COM對象的生命周期l         客戶端的COM對象的方法在C++中的調用通過產(chǎn)生該對象的實例同時獲得該對象的接口指針,通過接口指針來訪問該對象的方法。在.NET框架下則可以直接通過函數(shù)的映射來獲得(Clients of .NET objects can oBTain a description of an object's functionality using Reflection.)l         在.NET框架下的運行環(huán)境中.NET可以在內存中為.NET重新對象分配內存使用。(NET objects reside in memory managed by the .NET Framework execution environment.)為了解決上述問題,.NET提供一個COM Wrappers.它可以使得Managed Code 和 Unmanaged Code可以很好結合在一起。COM Wrappers兩種橋接方式RCW(runtime callable wrapper)和CCW(COM callable wrapper)其中RCW是將Managed的客戶端與Unmanaged的服務器端聯(lián)接起來的;CCW是將Unmanaged的客戶端與 Managed的服務器端聯(lián)接起來的。2.        HRESULTs and Exceptions在COM編程中我們通過HRESULT來判定所做的操作是否成功,在.NET框架下我們通過拋不同的異常(Throw Exceptions)來捕捉錯誤。注MSDN給我們列出了HRESULT不同值與.NET的不同異常的對照表。(.NET Framework Developer’s Guide—HRESULTs and Exceptions)3.        繼續(xù)、聚合和包容(Inheritance,Aggregation and Containment)繼續(xù):.NET提供一些標準的接口,用戶在定義接口時,可以繼續(xù)這些接口。聚合:.NET也支持COM提供的聚合的概念即,外對象將內對象的接口暴露在用戶面前。包容:    通過在外對象的構造函數(shù)中創(chuàng)建內對象的實例,這樣客戶端就可以通過該實例獲得接口進行調用接口的各個方法。4.        如何運用COM interop來生成發(fā)出事件和處理事件在以下內容中,將要描述有關COM對象出接口與事件接收器的連接機制。關于COM對象的出接口與事件接收器之間的連接機制與在描述COM原理與應用中的機制是一樣的,即COM對象聲明一個出接口,在事件接收器中表示該接口的實現(xiàn)方法。一旦,COM對象與事件接收器的連接建立好以后,那么客戶端就可以隨時接收到COM對象服務器端的事件、消息。下面我們從C#的服務器端和事件接收器兩個方面來描述這個問題。Handling Events Raised by a COM Source(描述COM源對象是如何產(chǎn)生一個事件的)Raising Events Handled by a COM Sink(通過接收器來處理事件)5.        System.Runtime.InteropServices命名空間System.Runtime.InteropServices是一個有關訪問COM對象以及在.NET框架下的本地API函數(shù)。在創(chuàng)建COM接口時經(jīng)常要運用這個命名空間。二、C#接口編程     下面將從接口的定義、接口的訪問、接口的實現(xiàn)以及接口的轉換編程這些方面來闡述運用C#進行接口編程的方法。1. 接口的定義接口的聲明:[attributes] [modifiers] interface identifier [:base-list] {interface-body}[;]l         attributes(可選):附加的定義性信息。l         · modifiers(可選):答應使用的修飾符有new和四個訪問修飾符。分別是:new、public、protected、internal、private。在一個接口定義中同一修飾符不答應出現(xiàn)多次,new修飾符只能出現(xiàn)在嵌套接口中,表示覆蓋了繼續(xù)而來的同名成員。The public, protected, internal, and private修飾符定義了對接口的訪問權限。 l         指示器和事件。l         identifier:接口名稱。 l         base-list(可選):包含一個或多個顯式基接口的列表,接口間由逗號分隔。 l         interface-body:對接口成員的定義。 l         接口可以是命名空間或類的成員,并且可以包含下列成員的簽名: 方法、屬性、索引器 。 l         一個接口可從一個或多個基接口繼續(xù)。接口的主體:               interface-body:  {   interface-member-declarationsopt   }接口可以包含一個和多個成員,這些成員可以是方法、屬性、索引指示器和事件,但不能是常量、域、操作符、構造函數(shù)或析構函數(shù),而且不能包含任何靜態(tài)成員。接口定義創(chuàng)建新的定義空間,并且接口定義直接包含的接口成員定義將新成員引入該定義空間。   2. 接口的訪問       C#中的CASTS來代替QueryInterface       (Using Casts Instead of QueryInterface)在C++中客戶端需要通過QueryInterface來獲得COM對象的接口指針。在C#編程中卻不必這么麻煩。我們可以直接將COM對象對應到相應的COM接口上。假如我們在程序中對應錯誤,那么在運行時C#會拋出異常。   3. 接口的實現(xiàn)              顯示地實現(xiàn)接口成員即可以直接利用類來實現(xiàn)接口的成員函數(shù)如:         // Since the .NET Framework interface and coclass have to behave as          // COM objects, we have to give them guids.


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 板桥市| 印江| 出国| 南部县| 江川县| 民丰县| 鹤山市| 沁源县| 韩城市| 特克斯县| 威海市| 收藏| 绥滨县| 柳州市| 綦江县| 岳普湖县| 大安市| 抚远县| 长垣县| 尉犁县| 车致| 龙南县| 常山县| 通山县| 呼图壁县| 永善县| 渝中区| 公安县| 乐山市| 黄冈市| 桃源县| 洛川县| 南靖县| 岢岚县| 中阳县| 丰原市| 武夷山市| 什邡市| 榆林市| 故城县| 乡城县|