日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
學(xué)習(xí)C#接口編程——C#接口轉(zhuǎn)換

C#中不僅支持.Net平臺(tái),而且支持COM平臺(tái)。為了支持COM和.Net,C#包含一種稱為屬性的獨(dú)特語(yǔ)言特性。一個(gè)屬性實(shí)際上就是一個(gè)C#類(lèi),它通過(guò)修飾源代碼來(lái)提供元信息。屬性使C#能夠支持特定的技術(shù),如COM和.Net,而不會(huì)干擾語(yǔ)言規(guī)范本身。C#提供將COM接口轉(zhuǎn)換為C#接口的屬性類(lèi)。另一些屬性類(lèi)將 COM類(lèi)轉(zhuǎn)換為C# 類(lèi)。執(zhí)行這些轉(zhuǎn)換不需要任何 IDL 或類(lèi)工廠。

現(xiàn)在部署的任何COM組件都可以在接口轉(zhuǎn)換中使用。通常情況下,所需的調(diào)整是完全自動(dòng)進(jìn)行的。特別是,可以使用運(yùn)行時(shí)可調(diào)用包裝 (RCW) 從 .NET 框架訪問(wèn) COM 組件。此包裝將 COM 組件提供的 COM 接口轉(zhuǎn)換為與 .NET 框架兼容的接口。對(duì)于 OLE 自動(dòng)化接口,RCW 可以從類(lèi)型庫(kù)中自動(dòng)生成;對(duì)于非OLE 自動(dòng)化接口,開(kāi)發(fā)人員可以編寫(xiě)自定義 RCW,手動(dòng)將 COM 接口提供的類(lèi)型映射為與 .NET 框架兼容的類(lèi)型。

C#接口轉(zhuǎn)換:使用ComImport引用COM組件

COM Interop 提供對(duì)現(xiàn)有COM組件的訪問(wèn),而不需要修改原始組件。使用ComImport引用COM組件常包括下面幾個(gè)方面的問(wèn)題:

· 創(chuàng)建 COM 對(duì)象。

· 確定 COM 接口是否由對(duì)象實(shí)現(xiàn)。

· 調(diào)用 COM 接口上的方法。

· 實(shí)現(xiàn)可由 COM 客戶端調(diào)用的對(duì)象和接口。

創(chuàng)建 COM 類(lèi)包裝

要使 C# 代碼引用COM 對(duì)象和接口,需要在 C# 中包含 COM 接口的定義。完成此操作的最簡(jiǎn)單方法是使用 TlbImp.exe(類(lèi)型庫(kù)導(dǎo)入程序),它是一個(gè)包括在 .NET 框架 SDK 中的命令行工具。TlbImp 將 COM 類(lèi)型庫(kù)轉(zhuǎn)換為 .NET 框架元數(shù)據(jù),從而有效地創(chuàng)建一個(gè)可以從任何托管語(yǔ)言調(diào)用的托管包裝。用 TlbImp 創(chuàng)建的 .NET 框架元數(shù)據(jù)可以通過(guò) /R 編譯器選項(xiàng)包括在 C# 內(nèi)部版本中。如果使用 Visual Studio 開(kāi)發(fā)環(huán)境,則只需添加對(duì) COM 類(lèi)型庫(kù)的引用,將為您自動(dòng)完成此轉(zhuǎn)換。

TlbImp 執(zhí)行下列轉(zhuǎn)換:

· COM coclass 轉(zhuǎn)換為具有無(wú)參數(shù)構(gòu)造函數(shù)的 C# 類(lèi)。

· COM 結(jié)構(gòu)轉(zhuǎn)換為具有公共字段的 C# 結(jié)構(gòu)。

檢查 TlbImp 輸出的一種很好的方法是運(yùn)行 .NET 框架 SDK 命令行工具 Ildasm.exe(Microsoft 中間語(yǔ)言反匯編程序)來(lái)查看轉(zhuǎn)換結(jié)果。

雖然 TlbImp 是將 COM 定義轉(zhuǎn)換為 C# 的***方法,但也不是任何時(shí)候都可以使用它(例如,在沒(méi)有 COM 定義的類(lèi)型庫(kù)時(shí)或者 TlbImp 無(wú)法處理類(lèi)型庫(kù)中的定義時(shí),就不能使用該方法)。在這些情況下,另一種方法是使用 C# 屬性在 C# 源代碼中手動(dòng)定義 COM 定義。創(chuàng)建 C# 源映射后,只需編譯 C# 源代碼就可產(chǎn)生托管包裝。

執(zhí)行 COM 映射需要理解的主要屬性包括:

· ComImport:它將類(lèi)標(biāo)記為在外部實(shí)現(xiàn)的 COM 類(lèi)。

· Guid:它用于為類(lèi)或接口指定通用唯一標(biāo)識(shí)符 (UUID)。

· InterfaceType,它指定接口是從 IUnknown 還是從 IDispatch 派生。

· PreserveSig,它指定是否應(yīng)將本機(jī)返回值從 HRESULT 轉(zhuǎn)換為 .NET 框架異常。

聲明 COM coclass

COM coclass 在 C# 中表示為類(lèi)。這些類(lèi)必須具有與其關(guān)聯(lián)的 ComImport 屬性。下列限制適用于這些類(lèi):

· 類(lèi)不能從任何其他類(lèi)繼承。

· 類(lèi)不能實(shí)現(xiàn)任何接口。

· 類(lèi)還必須具有為其設(shè)置全局唯一標(biāo)識(shí)符 (GUID) 的 Guid 屬性。

以下示例在 C# 中聲明一個(gè) coclass:

C# 編譯器將添加一個(gè)無(wú)參數(shù)構(gòu)造函數(shù),可以調(diào)用此構(gòu)造函數(shù)來(lái)創(chuàng)建 COM coclass 的實(shí)例。

創(chuàng)建 COM 對(duì)象

COM coclass 在 C# 中表示為具有無(wú)參數(shù)構(gòu)造函數(shù)的類(lèi)。使用 new 運(yùn)算符創(chuàng)建該類(lèi)的實(shí)例等效于在 C# 中調(diào)用 CoCreateInstance。使用以上定義的類(lèi),就可以很容易地實(shí)例化此類(lèi):

聲明 COM 接口

COM 接口在 C# 中表示為具有 ComImport 和 Guid屬性的接口。它不能在其基接口列表中包含任何接口,而且必須按照方法在 COM 接口中出現(xiàn)的順序聲明接口成員函數(shù)。

在 C# 中聲明的 COM 接口必須包含其基接口的所有成員的聲明,IUnknown 和 IDispatch 的成員除外(.NET 框架將自動(dòng)添加這些成員)。從 IDispatch 派生的 COM 接口必須用 InterfaceType 屬性予以標(biāo)記。

從 C# 代碼調(diào)用 COM 接口方法時(shí),公共語(yǔ)言運(yùn)行庫(kù)必須封送與 COM 對(duì)象之間傳遞的參數(shù)和返回值。對(duì)于每個(gè) .NET 框架類(lèi)型均有一個(gè)默認(rèn)類(lèi)型,公共語(yǔ)言運(yùn)行庫(kù)將使用此默認(rèn)類(lèi)型在 COM 調(diào)用間進(jìn)行封送處理時(shí)封送。例如,C# 字符串值的默認(rèn)封送處理是封送到本機(jī)類(lèi)型 LPTSTR(指向 TCHAR 字符緩沖區(qū)的指針)??梢栽?COM 接口的 C# 聲明中使用 MarshalAs 屬性重寫(xiě)默認(rèn)封送處理。

在 COM 中,返回成功或失敗的常用方法是返回一個(gè) HRESULT,并在 MIDL 中有一個(gè)標(biāo)記為"retval"、用于方法的實(shí)際返回值的 out 參數(shù)。在 C#(和 .NET 框架)中,指示已經(jīng)發(fā)生錯(cuò)誤的標(biāo)準(zhǔn)方法是引發(fā)異常。

默認(rèn)情況下,.NET 框架為由其調(diào)用的 COM 接口方法在兩種異常處理類(lèi)型之間提供自動(dòng)映射。

返回值更改為標(biāo)記為 retval 的參數(shù)的簽名(如果方法沒(méi)有標(biāo)記為 retval 的參數(shù),則為 void)。

標(biāo)記為 retval 的參數(shù)從方法的參數(shù)列表中剝離。

任何非成功返回值都將導(dǎo)致引發(fā) System.COMException 異常。

此示例顯示用 MIDL 聲明的 COM 接口以及用 C# 聲明的同一接口(注意這些方法使用 COM 錯(cuò)誤處理方法)。

下面是C#接口轉(zhuǎn)換的C#程序:

若要防止 HRESULT 翻譯為 COMException,請(qǐng)?jiān)?C# 聲明中將 PreserveSig(true) 屬性附加到方法。

下面是一個(gè)使用C# 映射媒體播放機(jī)COM 對(duì)象的程序。

運(yùn)行示例:

若要顯示影片示例 Clock.avi,請(qǐng)使用以下命令:

這將在屏幕上顯示影片,直到按 ENTER 鍵停止。

在 .NET 框架程序中通過(guò)DllImport使用 Win32 API

.NET 框架程序可以通過(guò)靜態(tài) DLL 入口點(diǎn)的方式來(lái)訪問(wèn)本機(jī)代碼庫(kù)。DllImport 屬性用于指定包含外部方法的實(shí)現(xiàn)的dll 位置。

DllImport 屬性定義如下:

說(shuō)明:

· DllImport只能放置在方法聲明上。

· DllImport具有單個(gè)定位參數(shù):指定包含被導(dǎo)入方法的 dll 名稱的 dllName 參數(shù)。

· DllImport具有五個(gè)命名參數(shù):

CallingConvention 參數(shù)指示入口點(diǎn)的調(diào)用約定。如果未指定 CallingConvention,則使用默認(rèn)值 CallingConvention.Winapi。

CharSet 參數(shù)指示用在入口點(diǎn)中的字符集。如果未指定 CharSet,則使用默認(rèn)值 CharSet.Auto。

EntryPoint 參數(shù)給出 dll 中入口點(diǎn)的名稱。如果未指定 EntryPoint,則使用方法本身的名稱。

ExactSpelling 參數(shù)指示 EntryPoint 是否必須與指示的入口點(diǎn)的拼寫(xiě)完全匹配。如果未指定 ExactSpelling,則使用默認(rèn)值 false。

PreserveSig 參數(shù)指示方法的簽名應(yīng)當(dāng)被保留還是被轉(zhuǎn)換。當(dāng)簽名被轉(zhuǎn)換時(shí),它被轉(zhuǎn)換為一個(gè)具有 HRESULT 返回值和該返回值的一個(gè)名為 retval 的附加輸出參數(shù)的簽名。如果未指定 PreserveSig,則使用默認(rèn)值 true。

SetLastError 參數(shù)指示方法是否保留 Win32"上一錯(cuò)誤"。如果未指定 SetLastError,則使用默認(rèn)值 false。

· 它是一次性屬性類(lèi)。

· 此外,用 DllImport 屬性修飾的方法必須具有 extern 修飾符。

下面是 C# 調(diào)用 Win32 MessageBox 函數(shù)的示例:

面向?qū)ο蟮木幊陶Z(yǔ)言幾乎都用到了抽象類(lèi)這一概念,抽象類(lèi)為實(shí)現(xiàn)抽象事物提供了更大的靈活性。C#也不例外,C#通過(guò)覆蓋虛接口的技術(shù)深化了抽象類(lèi)的應(yīng)用。

以上就是對(duì)C#接口轉(zhuǎn)換的介紹。


分享標(biāo)題:學(xué)習(xí)C#接口編程——C#接口轉(zhuǎn)換
標(biāo)題來(lái)源:http://m.5511xx.com/article/cdcipsh.html