共用方式為


Interop 封送處理概觀

更新:2007 年 11 月

大部分的資料型別在 Managed 和 Unmanaged 記憶體中有共同的表示。Interop 封送處理器會為您處理這些型別。其他型別可能是模稜兩可或根本不會在 Managed 記憶體表示。

模擬兩可的型別有時候不是有多個對應到單一 Managed 型別的 Unmanaged 表示,就是遺漏型別資訊 (例如陣列的大小)。針對模擬兩可的型別,封送處理器提供了預設的表示,以及替代的表示 (其中有多個表示存在)。您可以提供有關它如何封送處理模擬兩可型別的明確指示給封送處理器。

本主題一開始會先回顧平台叫用的觀念,以及 COM Interop 程式撰寫模型 (Programming Model)。本主題在封送處理和 COM Apartment 子主題中說明了 Interop 封送處理如何與 COM 封送處理進行整合。接著在封送處理遠端呼叫子主題中會說明封送處理器如何在分散式環境中執行。

平台叫用和 COM Interop 模型

Common Language Runtime 提供兩種與 Unmanaged 程式碼互通的機制:

  • 平台叫用,可以使 Managed 程式碼呼叫 Unmanaged 程式庫所匯出的函式

  • COM Interop,可以使 Managed 程式碼透過介面與 COM 物件進行互動

如果需要的話,平台叫用和 COM Interop 都會使用 Interop 封送處理來正確地將呼叫端和接收者之間的方法引數來回移動。如下圖所示,除了需要叫用回呼函式 (Callback Function) 的時候以外,平台叫用方法呼叫會從 Managed 流動至 Unmanaged 程式碼,而不會再有其他方式。即使平台叫用呼叫只可以從 Managed 流動至 Unmanaged 程式碼,資料還是可以當成 In 或 Out 參數在雙向流動。COM Interop 方法呼叫可以在任一方向流動。

平台叫用和 COM Interop 呼叫的流動

平台叫用

在最低層,兩種機制都使用相同的 Interop 封送處理服務,但某些資料型別只受 COM Interop 或平台叫用支援。如需詳細資訊,請參閱預設的封送處理行為

封送處理和 COM Apartment

Interop 封送處理器會在 Common Language Runtime 堆積 (Heap) 與 Unmanaged 堆積之間將資料封送處理。每當呼叫端和接收者無法在資料的相同執行個體 (Instance) 上進行操作時,就會發生封送處理。即使呼叫端和接受者有其自己的資料複本,Interop 封送處理器還是可以讓呼叫端和接受者似乎在相同資料上進行操作。

COM 也有一個封送處理器,可在 COM Apartment 或不同 COM 處理序 (Process) 之間封送處理資料。在相同 COM Apartment 內的 Managed 和 Unmanaged 程式碼之間呼叫時,只會需要 Interop 封送處理器。在不同 COM Apartment 或不同處理序中的 Managed 程式碼和 Unmanaged 程式碼之間呼叫時,會需要 Interop 封送處理器和 COM 封送處理器。

COM 用戶端和 .NET 伺服器

含有組件登錄工具 (Regasm.exe) 所註冊的型別程式庫的匯出 Managed 伺服器具有設為 BothThreadingModel 登錄項目。這個值表示伺服器能夠在單一執行緒 Apartment (STA) 或多執行緒 Apartment (MTA) 中啟動。伺服器物件是在和其呼叫端一樣的 Apartment 中建立的,如下表所顯示。

COM 用戶端

.NET 伺服器

封送處理需求

STA

Both 變成 STA

相同 Apartment 封送處理

MTA

Both 變成 MTA

相同 Apartment 封送處理

由於用戶端和伺服器是位於相同的 Apartment 之中,Interop 封送處理服務會自動處理所有的資料封送處理。下圖顯示 Interop 封送處理服務在相同 COM-Style Apartment 內的 Managed 與 Unmanaged 堆積之間進行操作。

相同 Apartment 封送處理過程

Interop 封送處理。

如果您打算匯出 Managed 伺服器,請注意 COM 用戶端會決定伺服器的 Apartment。由 MTA 中初始化的 COM 用戶端所呼叫的 Managed 伺服器必須確保執行緒安全。

.NET 用戶端和 COM 伺服器

.NET 用戶端 Apartment 的預設值是 MTA;不過,.NET 用戶端的應用程式類型可以變更預設值。例如,Visual Basic 2005 用戶端 Apartment 設定為 STA,您可以使用 STAThreadAttributeMTAThreadAttributeThread.ApartmentState 屬性或 Page.AspCompatMode 屬性,來檢查及變更 Managed 用戶端的 Apartment 設定。

元件的撰寫者會設定 COM 伺服器的執行緒相似性。下表顯示 .NET 用戶端和 COM 伺服器的 Apartment 設定值組合。同時也為組合顯示產生的封送處理需求。

.NET 用戶端

COM 伺服器

封送處理需求

MTA (預設)

MTA

STA

Interop 封送處理

Interop 和 COM 封送處理

STA

MTA

STA

Interop 和 COM 封送處理

Interop 封送處理

當 Managed 用戶端和 Unmanaged 伺服器位於相同的 Apartment 之中時,Interop 封送處理服務會自動處理所有的資料封送處理。不過,當用戶端和伺服器在不同 Apartment 中初始化時,也會要求 COM 封送處理。下圖顯示跨 Apartment 呼叫的項目。

.NET 用戶端和 COM 物件之間的跨 Apartment 呼叫

COM 封送處理

對於跨 Apartment 封送處理,可以執行下列動作:

  • 接受跨 Apartment 封送處理的固定成本,而只有當有很多呼叫跨界限時才值得注意。您必須註冊呼叫的 COM 元件之型別程式庫,以成功跨 Apartment 介面。

  • 將用戶端執行緒設為 STA 或 MTA 來更改主執行緒。例如,假設您的 C# 用戶端呼叫許多 STA COM 元件,可以將主執行緒設為 STA,以避免跨 Apartment 封送處理。

    注意事項:

    一旦將 C# 用戶端的執行緒設為 STA 之後,MTA COM 元件的呼叫將需要跨 Apartment 封送處理。

如需明確選取 Apartment 模型的指示,請參閱 Managed 和 Unmanaged 執行緒處理

封送處理遠端呼叫

如同使用跨 Apartment 封送處理,每當物件存放在不同處理序中時,在 Managed 和 Unmanaged 程式碼之間的每一個呼叫中會需要 COM 封送處理。例如:

  • 在遠端主機上叫用 Managed 伺服器的 COM 用戶端會使用 DCOM

  • 在遠端主機上叫用 COM 伺服器的 Managed 物件會使用 DCOM

下圖顯示 Interop 封送處理和 COM 封送處理如何跨處理序與主機界限提供通訊通道。

跨處理序封送處理

COM 封送處理

保留識別

Common Language Runtime 會保留 Managed 和 Unmanaged 參考的識別 (Identity)。下圖顯示跨處理序和主機界限的直接 Unmanaged 參考 (上一列) 和直接 Managed 參考 (下一列) 的流程。

跨處理序和主機界限傳遞的參考

COM 可呼叫包裝函式和執行階段可呼叫包裝函式

在本圖中:

  • Unmanaged 用戶端會從 Managed 物件中取得 COM 物件的參考,而這個 Managed 物件會從遠端主機中取得這個參考。遠端處理機制是 DCOM。

  • Managed 用戶端會從 COM 物件中取得 Managed 物件的參考,而這個 COM 物件會從遠端主機取得這個參考。遠端處理機制是 DCOM。

    注意事項:

    必須註冊 Managed 伺服器的匯出型別程式庫。

呼叫端和接收者之間的處理序界限數目是無關的;相同的直接參考會發生在同處理序 (In-Process) 與跨處理序 (Out-Of-Process) 呼叫之中。

Managed 遠端處理

Runtime 也提供 Managed 遠端處理,您可以用來建立跨處理序和主機界限之 Managed 物件之間的通訊頻道。Managed 遠端處理可以提供通訊元件間的防火牆 (Firewall),如下圖所顯示。

使用 SOAP 或 TcpChannel 類別進行跨防火牆的遠端呼叫

SOAP 或 TcpChannel

某些 Unmanaged 呼叫可以透過 SOAP 進行傳送,例如 Serviced 元件和 COM 之間的呼叫。如需使用 Managed 遠端處理的其他資訊,請參閱 NET Framework 遠端處理概觀

請參閱

其他資源

Interop 封送處理

預設的封送處理行為

使用平台叫用封送處理資料

使用 COM Interop 封送處理資料