COM 與 .NET 之間的互操作性簡介

元件物件模型 (COM) 和 .NET 開發在物件存留期管理、介面建立和介面繼承方面具有非常不同的類型系統和機制。

例如,COM 中的 Variant 類型是 .NET Framework 中的 System.Object 數據類型。 若要建立物件,COM 用戶端會呼叫 CoCreateInstance,而 Managed 用戶端可以使用關鍵詞,例如內建於 Managed 程式設計語言的 new 或 New。

雖然 COM 不支援傳統繼承,而且 COM 用戶端會管理 IUnknown 所提供的內部參考計數來釋放 Coclass,但受控用戶端會依賴 Common Language Runtime (CLR) .NET Framework 所提供的垃圾收集行程來釋放物件。

由於 COM 與 .NET 開發之間有這種差異,在 COM 物件模型上開發受控用戶端需要解決這些差異的機制。 運行時間可呼叫包裝函式 (RCW) 是一種機制,可提升 COM 與 Managed 程式設計模型之間的透明通訊。

本主題提供 RCW 如何促進 COM 與 Managed 程式設計模型之間通訊的高階描述。 請注意,即使本主題使用Visual Studio來說明 RCW機制,您還是可以使用Visual Studio外部的Interop元件來開發受控用戶端。

促進互操作性:Interop 元件和 RCW

編譯時間

Interop 元件會定義對應至 COM 型別連結庫,且受控用戶端可以與其互動的受控介面。 若要在 Visual Studio 中使用 Interop 元件,請先新增對應 COM 元件的參考。 Visual Studio 會自動產生 Interop 元件的本地副本。 Interop 元件包含一個命名空間,其中 COM 物件模型中每個 COM 物件都有一個 Managed 對等介面。

圖 1 說明想要使用 COM 類型連結庫來定義 coclass X 的受控用戶端。Managed 用戶端會呼叫類別 X,這是 coclass X 的 Managed 對等介面,如 Interop 元件中所定義。 在編譯時期,會使用 Interop 元件中類別 X 的相關信息來編譯 Managed 專案。

圖 1: 使用與 Unmanaged 類型連結庫互操作的 Interop 元件編譯的 Managed 應用程式

使用與 Unmanaged 類型連結庫互操作的 Interop 元件編譯的 Managed 應用程式

一般而言,只要您設定類型庫的參考,Visual Studio 就會為該類型連結庫產生 Interop 元件的複本。 可以有任意數目的 Interop 元件來描述相同的 COM 類型。 不過,類型庫只能有一個主要 Interop 元件 (PIA) ,也就是類型連結庫所發佈的 Interop 元件。 與其他 Interop 元件不同,每次您在 Visual Studio 中新增參考時,並不會產生 PIA。 相反地,您可以將 PIA 安裝到全域程式集緩存 (GAC) 電腦上只安裝一次。 當您新增類型連結庫的參考時,Visual Studio 會自動載入 PIA。

若要為 Outlook 設計受控解決方案,您應該使用 Outlook PIA。 若要將來自 Outlook PIA 的資訊併入受控載入宏,您必須先在 GAC 中安裝 Outlook PIA。 如果您使用 Visual Studio 來建立受控專案,則在新增 Outlook 類型連結庫的參考之後,Visual Studio 會載入 PIA。 在對象瀏覽器的命名空間 Microsoft.Office.Interop.Outlook 底下,您可以看到具有與 Outlook 物件模型中對象對應之名稱的 Managed 介面。 例如,Account 介面會對應至 Outlook 物件模型中的 Account 物件。 當您編譯受控專案時,這項資訊會併入您的可執行檔中。

運行時間

在運行時間,使用 Interop 元件所提供的資訊,.NET Framework CLR 會為受控用戶端所互動的每個共同類別建立 RCW。 請注意,無論用戶端從 coclass 取得多少個介面,運行時間只會為每個 coclass 建立一個 RCW。 RCW 是包裝在 COM coclass 的 .NET Framework 類別類型。 RCW 會追蹤 coclass 的實例,並且只有在用戶端不再需要 RCW 時,才會發行它們的參考。 如此一來,受控用戶端就不需要像 Unmanaged 用戶端在 COM 下一樣管理物件的存留期。

圖 2 說明 RCW 在運行時間攔截來自受管理用戶端的 API 呼叫,並使用 Interop 元件的資訊,以透明方式將呼叫對應至 COM Coclass 中的對應 API。 下列程式描述此情況的發生方式:

  1. Managed 用戶端會呼叫 X 類別的方法 A',如 COM 類型連結庫的 Interop 元件中所定義。

  2. 如果類別 X 的 RCW 尚未存在,.NET Framework 執行時間會使用 Interop 元件中的資訊,並建立類別 X 的 RCW。

  3. RCW 會攔截對方法 A' 的呼叫、將自變數轉譯成對應的 COM 類型,並叫用 COM 類型連結庫中定義之 coclass X 的方法 A。

圖 2: RCW 會攔截來自受控可執行檔的呼叫,並將它對應至 Unmanaged 類型連結庫中的 Coclass

RCW 會攔截來自受控可執行檔的呼叫,並將它對應至 Unmanaged 類型連結庫中的 Coclass

另請參閱