Interop 封送處理

Interop 封送處理會控制如何以方法引數傳遞資料,以及控制呼叫期間於 Managed 和 Unmanaged 記憶體之間的傳回值。 Interop 封送處理是由 Common Language Runtime 的封送處理服務所執行的執行階段活動。

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

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

本概觀包含下列各節:

  • 平台叫用和 COM Interop 模型

  • 封送處理和 COM Apartment

  • 封送處理遠端呼叫

  • 相關主題

  • 參考資料

平台叫用和 COM Interop 模型

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

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

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

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

含有 Regasm.exe (組件登錄工具) 所註冊的型別程式庫的匯出 Managed 伺服器具有設為 Both 的 ThreadingModel 登錄項目。 這個值表示伺服器能夠在單一執行緒 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 伺服器必須確保執行緒安全。

Managed 用戶端與 COM 伺服器

Managed 用戶端 Apartment 的預設值是 MTA;不過 .NET 用戶端的應用程式類型可以變更預設值。 例如,Visual Basic 2005 用戶端 Apartment 設定為 STA。 您可以使用 System.STAThreadAttributeSystem.MTAThreadAttributeThread.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 用戶端會使用分散式 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 Remoting Overview

回到頁首

相關主題

標題

說明

預設的封送處理行為

描述 Interop 封送處理用來封送處理資料的規則。

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

描述如何宣告方法參數,以及將引數傳遞給 Unmanaged 程式庫所匯出的函式。

使用 COM Interop 封送處理資料

描述如何自訂 COM 包裝函式以更改封送處理行為。

HOW TO:對應 HRESULT 和例外狀況

描述如何將自訂例外狀況對應到 HRESULT,並提供每一個 HRESULT 與其在 .NET Framework 中可比較的例外狀況類別之完整對應。

使用泛型型別互通

描述使用泛型型別來取得 COM 互通性時,所支援的動作為何。

與 Unmanaged 程式碼互通

說明 Common Language Runtime 提供的互通性服務。

進階 COM 互通性

提供關於將 COM 元件加入至 .NET Framework 應用程式的詳細資訊連結。

互通的設計考量

提供撰寫整合式 COM 元件的秘訣。

.NET Remoting

說明 .NET Framework 中可用來進行遠端通訊的各種方法。

回到頁首

參考資料

System.Runtime.InteropServices

回到頁首