Note
本文專指 .NET 框架。 此規定不適用於較新的 .NET 實作,包括 .NET 6 及更新版本。
nonComVisibleBaseClass當QueryInterface管理除錯助理(MDA)在 COM 可調用封裝器(CCW)上,對 COM 可見的管理類別進行本地或非管理程式碼呼叫時,該基底類別不在 COM 可視化時會啟動。 呼叫只會 QueryInterface 在呼叫請求類別介面或 IDispatch COM 可見的管理類別預設時啟動 MDA。 當 是 QueryInterface 明確介面且已套用該 ClassInterfaceAttribute 屬性且由 COM 可視類別明確實作時,MDA 不會被啟動。
Symptoms
一個 QueryInterface 從本機程式碼中呼叫,且因 COR_E_INVALIDOPERATION HRESULT 而失敗。 HRESULT 可能是因為執行時無法呼叫 QueryInterface ,導致此 MDA 的啟動。
原因
執行時無法允許 QueryInterface 呼叫來自非 COM 可見類別的類別介面或預設 IDispatch 介面,因為可能存在版本管理問題。 例如,若有公共成員加入基底類別但 COM 不可見,現有使用衍生類別的 COM 用戶端可能會因變更而導致衍生類別成員的 vtable 被改變而損壞。 暴露於 COM 的明確介面不會有此問題,因為它們不包含 vtable 中介面的基底成員。
解決方法
不要暴露類別介面。 定義一個明確的介面,並套用 ClassInterfaceAttribute 該屬性。
對運行時間的影響
此 MDA 對 CLR 沒有影響。
Output
以下是一個對 COM 可視類別呼叫的訊息範例訊息,該 QueryInterface 類別 Derived 源自非 COM 可視類別 Base。
A QueryInterface call was made requesting the class interface of COM
visible managed class 'Derived'. However since this class derives from
non COM visible class 'Base', the QueryInterface call will fail. This
is done to prevent the non COM visible base class from being
constrained by the COM versioning rules.
Configuration
<mdaConfig>
<assistants>
<nonComVisibleBaseClass />
</assistants>
</mdaConfig>