System.Runtime.InteropServices.ComWrappers 類別

本文提供此 API 參考文件的補充備註。

ComWrappers API 提供IUnknown與內建 COM互操作性支持無關的 API 支援。 ComWrappers API 會公開開發人員需要的最低運行時間支援,以有效率的方式取代內建版本。

傳統上,在運行時間中,Managed 物件的原生 Proxy 稱為 COM 可呼叫包裝函式 (CCW),而原生物件的 Managed Proxy 稱為運行時間可呼叫包裝函式 (RCW)。 不過,在此使用時,這些詞彙不應與同名的內建功能混淆(亦即 CCWRCW)。 不同於內建功能,大部分負責精確的存留期管理、分派方法,以及封送自變數和傳回值,都留給 ComWrappers 實作者。

「最低支援」是由下列功能所定義:

  1. 受控物件與原生 Proxy 之間的有效對應(例如CCW)。
  2. 原生 IUnknown 與其 Managed Proxy 之間的有效對應(例如 RCW)。
  3. 透過 IReferenceTrackerHost 介面合約與垃圾收集行程整合。

利用此為進階案例。

Proxy 狀態

本節提供各自建立之後原生和受控 Proxy 狀態的描述和圖例。

在下圖中,強式參考會描述為實線(===),而弱式參考則描述為虛線(= = =)。 「強式參考」和「弱式參考」一詞應解譯為「延長存留期」和「不延長存留期」,而不是暗示特定實作。

下圖顯示Managed物件和原生 Proxy 在呼叫 ComWrappers.GetOrCreateComInterfaceForObject(Object, CreateComInterfaceFlags)之後的狀態。

 --------------------                  ----------------------
|   Managed object   |                |     Native proxy     |
|                    |                | Ref count: 1         |
|  ----------------  |                |  ------------------  |
| | Weak reference |=| = = = = = = = >| | Strong reference | |
| |    to proxy    | |<===============|=|    to object     | |
|  ----------------  |                |  ------------------  |
 --------------------                  ----------------------

下一個圖例顯示呼叫 ComWrappers.GetOrCreateObjectForComInstance(IntPtr, CreateObjectFlags)之後原生物件和 Managed Proxy 的狀態。 「身分識別」的概念遵循 的規則 IUnknown

 ------------------               ------------------
|  Native object   |< = = = = = =|                  |
| Ref count: +1    |             | Mapping from     |
 ------------------              | native identity  |
 ------------------------        | to managed proxy |
|   Managed proxy        |< = = =|                  |
| Created by ComWrappers |        ------------------
|   implementer.        |
| Optional AddRef() on   |
|   native object.      |
 ------------------------

觀察運行時間觀點中只有弱式參考存在。 假設 +1 原生對象的參考計數是由 Managed Proxy 建立者執行,也就是 ComWrappers 實作者,以確保原生物件與其 Managed Proxy 之間的相關聯存留期。 受控 Proxy 中有選擇性的強式參考 (也就是 AddRef()),可用來支援稍早所述的案例 (3)。 請參閱 CreateObjectFlags.TrackerObject。 使用此選擇性強式參考時,參考計數會是 +2