共用方式為


互通性概觀 (C# 程式設計手冊)

在本主題中,將說明可啟用 C# Managed 程式碼和 Unmanaged 程式碼間互通性 (Interoperability) 的方法。

平台叫用

「平台叫用」(Platform Invoke) 是一項服務,它可以讓 Managed 程式碼呼叫以動態連結程式庫 (DLL) 實作的 Unmanaged 函式 (例如,Microsoft Win32 API 中的函式)。 它會找出並叫用匯出的函式,並且依需要封送處理它的引數 (整數、字串、陣列、結構等) 跨越互通界限。

如需詳細資訊,請參閱 使用 Unmanaged DLL 函式HOW TO:使用平台叫用播放 WAV 檔 (C# 程式設計手冊)

注意事項注意事項

Common Language Runtime (CLR) (CLR) 負責管理對系統資源的存取。 呼叫 CLR 外部的 Unmanaged 程式碼時,會略過這項安全性機制,因而出現安全性風險。 例如,Unmanaged 程式碼可能會直接呼叫 Unmanaged 程式碼中的資源,而略過 CLR 安全性機制。 如需詳細資訊,請參閱 .NET Framework 安全性 (英文)。

C++ Interop 的比較

您可以使用 C++ Interop (也稱為 It Just Works (IJW)) 來包裝原生 (Native) C++ 類別,讓使用 C# 或其他 .NET Framework 語言撰寫的程式碼也可以使用此類別。 若要這麼做,您必須撰寫 C++ 程式碼以包裝原生 DLL 或 COM 元件。 和其他 .NET Framework 語言不同,Visual C++ 具有互通性支援,可讓 Managed 和 Unmanaged 程式碼位於相同的應用程式,甚至是同一個檔案中。 接著,您可以使用 /clr 編譯器參數來產生 Managed 組件,以建置 C++ 程式碼。 最後,在 C# 專案中加入該組件的參考並使用包裝後的物件,就和您使用其他 Managed 類別一樣。

如需詳細資訊,請參閱 HOW TO:包裝原生類別以便讓 C# 使用使用 C++ Interop (隱含 PInvoke)

將 COM 元件公開給 C#

您可以從 C# 專案使用 COM 元件。 一般的步驟如下:

  1. 找到要使用的 COM 元件,並註冊此元件。 使用 regsvr32.exe 來註冊或移除註冊 COM DLL。

  2. 在專案中加入 COM 元件或型別程式庫的參考。

    當您加入參考時,Visual Studio 會使用Tlbimp.exe (型別程式庫匯入工具),這個工具會以型別程式庫做為輸入,並輸出 .NET Framework Interop 組件。 組件 (亦稱為執行階段可呼叫包裝函式 (RCW)) 包含和包裝類別庫中的 COM 類別的 Managed 類別及介面。 Visual Studio 會將所產生之組件的參考加入至專案中。

  3. 建立類別的執行個體,這個類別是在 RCW 中定義。 這個執行個體接著會建立 COM 物件的執行個體。

  4. 以您在使用其他 Managed 物件時一樣的方法使用此物件。 當記憶體回收行程回收此物件時,也會從記憶體釋放 COM 物件的執行個體。

如需詳細資訊,請參閱將 COM 元件公開給 .NET Framework

將 C# 公開給 COM

COM 用戶端可以使用以正確方式公開的 C# 型別。 公開 C# 型別的基本步驟如下:

  1. 在 C# 專案中加入 Interop 屬性 (Attribute)。

    您可以修改 Visual C# 專案的屬性 (Property),讓組件成為 COM 可見。 如需詳細資訊,請參閱組件資訊對話方塊

  2. 產生 COM 型別程式庫,並註冊這個程式庫供 COM 使用。

    您可以修改 Visual C# 專案屬性,以自動註冊 COM Interop 的 C# 組件。 Visual Studio 使用 Regasm.exe (組件登錄工具),使用 /tlb 命令列參數 (會將 Managed 組件視為輸入) 來產生型別程式庫。 這個型別程式庫會描述組件中的 public 型別並加入登錄項目,使 COM 用戶端可以建立 Managed 類別。 如需詳細資訊,請參閱HOW TO:註冊 COM Interop 元件

如需詳細資訊,請參閱 將 .NET Framework 元件公開給 COM範例 COM 類別 (C# 程式設計手冊)

請參閱

概念

C# 程式設計手冊

其他資源

提升 Interop 效能

COM Interop 簡介

在 Managed 和 Unmanaged 程式碼之間進行封送處理

與 Unmanaged 程式碼互通

進階 COM 互通性

Interoperability in the .NET Compact Framework