nonComVisibleBaseClass MDA

更新:2007 年 11 月

當 COM 可見的 Managed 類別 (衍生自不是 COM 可見的基底類別) 之 COM 可呼叫包裝函式 (CCW) 上的機器碼或 Unmanaged 程式碼呼叫 QueryInterface 時,即會啟動 NonComVisibleBaseClass Managed 偵錯助理 (MDA)。QueryInterface 呼叫只會在呼叫要求類別介面或 COM 可見的 Managed 類別之預設 IDispatch 的情況下,才會啟動 MDA。當 QueryInterface 是針對具有已套用 ClassInterfaceAttribute 屬性的明確介面,而且是由 COM 可見類別所明確實作時,不會啟動此 MDA。

症狀

從失敗的機器碼進行的 QueryInterface 呼叫,且傳回 COR_E_INVALIDOPERATION HRESULT。HRESULT 可能是因為執行階段不允許會讓這個 MDA 啟動的 QueryInterface 呼叫。

原因

執行階段不能允許類別介面或 COM 可見類別 (衍生自不是 COM 可見的類別) 之預設 IDispatch 介面之 QueryInterface 呼叫,因為可能有版本控制的問題。例如,如果有任何公用成員加入到不是 COM 可見的基底類別,則使用衍生類別的現有 COM 用戶端可能會中斷,因為衍生類別的 Vtable (包含了基底類別成員) 將會由這類變更所更改。公開給 COM 的明確介面不會有這個問題,因為這些介面不包含此 Vtable 中的介面之基底成員。

解決方式

不要公開此類別介面;定義明確的介面,並為它套用 ClassInterfaceAttribute 屬性。

對執行階段的影響

這個 MDA 對 CLR 無效。

輸出

下列是衍生自非 COM 可見類別 Base 的 COM 可見類別 Derived 上之 QueryInterface 呼叫的範例訊息。

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. 

組態

<mdaConfig>
  <assistants>
    <nonComVisibleBaseClass />
  </assistants>
</mdaConfig>

請參閱

概念

診斷 Managed 偵錯助理的錯誤

Interop 封送處理概觀

參考

MarshalAsAttribute

其他資源

互通性