System.Runtime.InteropServices.ComWrappers 類別
本文提供此 API 參考文件的補充備註。
ComWrappers API 提供IUnknown
與內建 COM互操作性支持無關的 API 支援。 ComWrappers
API 會公開開發人員需要的最低運行時間支援,以有效率的方式取代內建版本。
傳統上,在運行時間中,Managed 物件的原生 Proxy 稱為 COM 可呼叫包裝函式 (CCW),而原生物件的 Managed Proxy 稱為運行時間可呼叫包裝函式 (RCW)。 不過,在此使用時,這些詞彙不應與同名的內建功能混淆(亦即 CCW 和 RCW)。 不同於內建功能,大部分負責精確的存留期管理、分派方法,以及封送自變數和傳回值,都留給 ComWrappers
實作者。
「最低支援」是由下列功能所定義:
- 受控物件與原生 Proxy 之間的有效對應(例如CCW)。
- 原生
IUnknown
與其 Managed Proxy 之間的有效對應(例如 RCW)。 - 透過 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
。