成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

學習C#接口編程——C#接口轉換

開發 后端
本文全面剖析了C#接口編程中的接口C#接口轉換,即使用ComImport引用COM組件,希望大家從中有所收獲。

C#中不僅支持.Net平臺,而且支持COM平臺。為了支持COM和.Net,C#包含一種稱為屬性的獨特語言特性。一個屬性實際上就是一個C#類,它通過修飾源代碼來提供元信息。屬性使C#能夠支持特定的技術,如COM和.Net,而不會干擾語言規范本身。C#提供將COM接口轉換為C#接口的屬性類。另一些屬性類將 COM類轉換為C# 類。執行這些轉換不需要任何 IDL 或類工廠。

現在部署的任何COM組件都可以在接口轉換中使用。通常情況下,所需的調整是完全自動進行的。特別是,可以使用運行時可調用包裝 (RCW) 從 .NET 框架訪問 COM 組件。此包裝將 COM 組件提供的 COM 接口轉換為與 .NET 框架兼容的接口。對于 OLE 自動化接口,RCW 可以從類型庫中自動生成;對于非OLE 自動化接口,開發人員可以編寫自定義 RCW,手動將 COM 接口提供的類型映射為與 .NET 框架兼容的類型。

C#接口轉換:使用ComImport引用COM組件

COM Interop 提供對現有COM組件的訪問,而不需要修改原始組件。使用ComImport引用COM組件常包括下面幾個方面的問題:

· 創建 COM 對象。

· 確定 COM 接口是否由對象實現。

· 調用 COM 接口上的方法。

· 實現可由 COM 客戶端調用的對象和接口。

創建 COM 類包裝

要使 C# 代碼引用COM 對象和接口,需要在 C# 中包含 COM 接口的定義。完成此操作的最簡單方法是使用 TlbImp.exe(類型庫導入程序),它是一個包括在 .NET 框架 SDK 中的命令行工具。TlbImp 將 COM 類型庫轉換為 .NET 框架元數據,從而有效地創建一個可以從任何托管語言調用的托管包裝。用 TlbImp 創建的 .NET 框架元數據可以通過 /R 編譯器選項包括在 C# 內部版本中。如果使用 Visual Studio 開發環境,則只需添加對 COM 類型庫的引用,將為您自動完成此轉換。

TlbImp 執行下列轉換:

· COM coclass 轉換為具有無參數構造函數的 C# 類。

· COM 結構轉換為具有公共字段的 C# 結構。

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

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

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

· ComImport:它將類標記為在外部實現的 COM 類。

· Guid:它用于為類或接口指定通用唯一標識符 (UUID)。

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

· PreserveSig,它指定是否應將本機返回值從 HRESULT 轉換為 .NET 框架異常。

聲明 COM coclass

COM coclass 在 C# 中表示為類。這些類必須具有與其關聯的 ComImport 屬性。下列限制適用于這些類:

· 類不能從任何其他類繼承。

· 類不能實現任何接口。

· 類還必須具有為其設置全局唯一標識符 (GUID) 的 Guid 屬性。

以下示例在 C# 中聲明一個 coclass: 

 C# 中聲明一個 coclass  

C# 編譯器將添加一個無參數構造函數,可以調用此構造函數來創建 COM coclass 的實例。

創建 COM 對象

COM coclass 在 C# 中表示為具有無參數構造函數的類。使用 new 運算符創建該類的實例等效于在 C# 中調用 CoCreateInstance。使用以上定義的類,就可以很容易地實例化此類: 

實例化此類 

聲明 COM 接口

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

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

從 C# 代碼調用 COM 接口方法時,公共語言運行庫必須封送與 COM 對象之間傳遞的參數和返回值。對于每個 .NET 框架類型均有一個默認類型,公共語言運行庫將使用此默認類型在 COM 調用間進行封送處理時封送。例如,C# 字符串值的默認封送處理是封送到本機類型 LPTSTR(指向 TCHAR 字符緩沖區的指針)。可以在 COM 接口的 C# 聲明中使用 MarshalAs 屬性重寫默認封送處理。

在 COM 中,返回成功或失敗的常用方法是返回一個 HRESULT,并在 MIDL 中有一個標記為"retval"、用于方法的實際返回值的 out 參數。在 C#(和 .NET 框架)中,指示已經發生錯誤的標準方法是引發異常。

默認情況下,.NET 框架為由其調用的 COM 接口方法在兩種異常處理類型之間提供自動映射。

返回值更改為標記為 retval 的參數的簽名(如果方法沒有標記為 retval 的參數,則為 void)。

標記為 retval 的參數從方法的參數列表中剝離。

任何非成功返回值都將導致引發 System.COMException 異常。

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

下面是C#接口轉換的C#程序:

接口轉換的C#程序 

 

若要防止 HRESULT 翻譯為 COMException,請在 C# 聲明中將 PreserveSig(true) 屬性附加到方法。

下面是一個使用C# 映射媒體播放機COM 對象的程序。

使用C# 映射媒體播放機COM 對象的程序  

運行示例:

若要顯示影片示例 Clock.avi,請使用以下命令: 

使用以下命令 

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

在 .NET 框架程序中通過DllImport使用 Win32 API

.NET 框架程序可以通過靜態 DLL 入口點的方式來訪問本機代碼庫。DllImport 屬性用于指定包含外部方法的實現的dll 位置。

DllImport 屬性定義如下:

DllImport 屬性定義  

說明:

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

· DllImport具有單個定位參數:指定包含被導入方法的 dll 名稱的 dllName 參數。

· DllImport具有五個命名參數:

CallingConvention 參數指示入口點的調用約定。如果未指定 CallingConvention,則使用默認值 CallingConvention.Winapi。

CharSet 參數指示用在入口點中的字符集。如果未指定 CharSet,則使用默認值 CharSet.Auto。

EntryPoint 參數給出 dll 中入口點的名稱。如果未指定 EntryPoint,則使用方法本身的名稱。

ExactSpelling 參數指示 EntryPoint 是否必須與指示的入口點的拼寫完全匹配。如果未指定 ExactSpelling,則使用默認值 false。

PreserveSig 參數指示方法的簽名應當被保留還是被轉換。當簽名被轉換時,它被轉換為一個具有 HRESULT 返回值和該返回值的一個名為 retval 的附加輸出參數的簽名。如果未指定 PreserveSig,則使用默認值 true。

SetLastError 參數指示方法是否保留 Win32"上一錯誤"。如果未指定 SetLastError,則使用默認值 false。

· 它是一次性屬性類。

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

下面是 C# 調用 Win32 MessageBox 函數的示例:

C# 調用 Win32 MessageBox 函數的示例 

面向對象的編程語言幾乎都用到了抽象類這一概念,抽象類為實現抽象事物提供了更大的靈活性。C#也不例外,C#通過覆蓋虛接口的技術深化了抽象類的應用。

以上就是對C#接口轉換的介紹。

【編輯推薦】

  1. C#3.5新特性的介紹
  2. C#中DirectSound錄音的使用
  3. C#擴展方法性能測試對比
  4. C#多標簽瀏覽器功能的擴展
  5. C#標簽的制作:多標簽的實現
責任編輯:book05 來源: 新浪博客
相關推薦

2009-08-24 11:02:52

C#接口映射

2009-08-24 10:06:31

C#接口成員

2009-08-25 10:44:08

C#接口定義接口

2009-08-25 10:57:09

C#接口

2009-08-24 10:31:37

C#接口繼承

2009-08-31 18:17:32

C#接口編程

2009-08-31 17:02:28

C#接口編程

2009-08-24 10:47:45

C#接口重實現

2009-08-20 18:06:18

學習C#接口

2009-08-12 15:55:12

C#接口定義

2009-09-02 14:14:44

C# COM接口轉換

2009-08-31 13:18:09

C# IWebMess

2009-08-14 17:58:05

C#接口方法

2009-08-31 15:55:17

C#實現Strateg

2009-08-03 18:08:39

C# ICloneab

2009-08-24 11:20:03

C#接口

2009-08-25 17:55:52

C#實現Strateg

2009-08-10 10:04:25

C#抽象類C#接口

2009-09-04 13:22:31

C#實現多個接口

2009-09-01 18:29:24

C#實現多個接口
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩一本 | 欧美综合一区二区 | 精品久久久久一区二区国产 | 天天天天操 | 狠狠婷婷综合久久久久久妖精 | 欧美精品中文字幕久久二区 | 欧美黄色性生活视频 | 亚州中文| 羞羞视频免费观看入口 | 亚洲电影成人 | 日韩精品在线看 | 日操操 | av成人在线观看 | 久久69精品久久久久久国产越南 | av中文字幕在线观看 | 日韩一区二区三区精品 | 欧美日韩18| 婷婷中文字幕 | 日本免费在线 | 久久鲁视频| 99在线免费观看视频 | 三级黄片毛片 | 日韩黄色免费 | 国产一区不卡在线观看 | 久久一 | 日韩视频在线一区 | 欧美亚洲一级 | 中文字幕一区在线观看视频 | 日本视频中文字幕 | 国产情侣在线看 | av一级久久 | 日韩欧美精品一区 | 国产精品美女久久久久久久网站 | 亚洲色图综合 | 精品欧美一区二区在线观看 | 亚洲一级淫片 | 精品1区| 91中文字幕在线观看 | 午夜电影福利 | 亚洲国产精品一区二区三区 | 狠狠骚 |