MDA nonComVisibleBaseClass

Note

Questo articolo è specifico per .NET Framework. Non si applica alle implementazioni più recenti di .NET, tra cui .NET 6 e versioni successive.

L'assistente nonComVisibleBaseClass al debug gestito viene attivato quando una QueryInterface chiamata viene eseguita da codice nativo o non gestito nel wrapper com chiamabile (CCW) di una classe gestita visibile com che deriva da una classe di base che non è COM visibile. La QueryInterface chiamata fa sì che l'assistente al debug gestito venga attivato solo nei casi in cui la chiamata richiede l'interfaccia della classe o l'impostazione predefinita della classe gestita IDispatch visibile a COM. L'assistente al debug gestito non viene attivato quando QueryInterface è per un'interfaccia esplicita che ha l'attributo ClassInterfaceAttribute applicato e viene implementato in modo esplicito dalla classe visibile com.

Symptoms

Chiamata QueryInterface eseguita da codice nativo che ha esito negativo con un COR_E_INVALIDOPERATION HRESULT. HRESULT potrebbe essere dovuto alla mancata abilitazione QueryInterface delle chiamate in fase di esecuzione che causano l'attivazione di questo assistente al debug gestito.

Cause

Il runtime non può consentire QueryInterface chiamate per l'interfaccia della classe o l'interfaccia predefinita IDispatch di una classe visibile com che deriva da una classe che non è visibile a COM a causa di potenziali problemi di controllo delle versioni. Se, ad esempio, tutti i membri pubblici sono stati aggiunti alla classe base che non è visibile a COM, i client COM esistenti che usano la classe derivata potrebbero potenzialmente interrompersi perché la vtable della classe derivata, che contiene i membri della classe base, verrebbe modificata da tale modifica. Le interfacce esplicite esposte a COM non presentano questo problema perché non includono i membri di base delle interfacce nella vtable.

Risoluzione

Non esporre l'interfaccia della classe. Definire un'interfaccia esplicita e applicarlo ClassInterfaceAttribute .

Effetto sul runtime

Questo assistente al debug gestito non ha alcun effetto su CLR.

Risultato

Di seguito è riportato un messaggio di esempio per una QueryInterface chiamata a una classe Derived visibile com che deriva da una classe Basenon visibile com.

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>

Vedere anche