第六節、介面轉換
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 架構相容的類型。
使用ComImport引用COM組件
COM Interop 提供對現有 COM 組件的訪問,而不需要修改原始組件。使用ComImport引用COM組件常包括下面 幾個方面的問題:
1、建立 COM 物件。
2、確定 COM 介面是否由對象實現。
3、調用 COM 介面上的方法。
4、實現可由 COM 用戶端調用的對象和介面。
建立 COM 類別封裝
要使 C# 代碼引用COM 物件和介面,需要在 C# 中包含 COM 介面的定義。完成此操作的最簡單方法是使用 TlbImp.exe(類型庫匯入程式),它是一個包括在 .NET 架構 SDK 中的命令列工具。TlbImp 將 COM 類別型庫轉換為 .NET 架構中繼資料,從而有效地建立一個可以從任何託管語言調用的託管封裝。用 TlbImp 建立的 .NET 架構中繼資料可以通過 /R 編譯器選項包括在 C# 組建中。如果使用 Visual Studio 開發環境,則只需添加對 COM 類別型庫的引用,將為您自動完成此轉換。
TlbImp 執行下列轉換:
1、COM coclass 轉換為具有無參數建構函式的 C# 類。
2、COM 結構轉換為具有公用欄位的 C# 結構。
檢查 TlbImp 輸出的一種很好的方法是運行 .NET 架構 SDK 命令列工具 Ildasm.exe(Microsoft 中繼語言反組譯工具)來查看轉換結果。
雖然 TlbImp 是將 COM 定義轉換為 C# 的首選方法,但也不是任何時候都可以使用它(例如,在沒有 COM 定義的類型庫時或者 TlbImp 無法處理類型庫中的定義時,就不能使用該方法)。在這些情況下,另一種方法是使用 C# 屬性在 C# 原始碼中手動定義 COM 定義。建立 C# 源映射後,只需編譯 C# 原始碼就可產生託管封裝。
執行 COM 映射需要理解的主要屬性包括:
1、ComImport:它將類標記為在外部實現的 COM 類別。
2、Guid:它用於為類或介面指定通用唯一識別碼 (UUID)。
3、InterfaceType,它指定介面是從 IUnknown 還是從 IDispatch 派生。
4、PreserveSig,它指定是否應將本機傳回值從 HRESULT 轉換為 .NET 架構異常。
聲明 COM coclass
COM coclass 在 C# 中表示為類。這些類必須具有與其關聯的 ComImport 屬性。下列限制適用於這些類:
1、類不能從任何其他類繼承。
2、類不能實現任何介面。
4、類還必須具有為其設定通用唯一識別碼 (GUID) 的 Guid 屬性。
以下樣本在 C# 中聲明一個 coclass:
// 聲明一個COM類 FilgraphManager
[ComImport, Guid("E436EBB3-524F-11CE-9F53-0020AF0BA770")]
class FilgraphManager
{ }
C# 編譯器將添加一個無參數建構函式,可以調用此建構函式來建立 COM coclass 的執行個體。
共4頁: 上一頁 1 [2][3][4]下一頁