Condividi tramite


nonComVisibleBaseClass (MDA)

Nota

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

L'assistente al debug gestito nonComVisibleBaseClass viene attivato quando viene effettuata una chiamata QueryInterface da codice nativo o non gestito nel CCW (COM Callable Wrapper) di una classe gestita visibile a COM, che deriva da una classe di base non visibile a COM. La chiamata QueryInterface determina l'attivazione dell'assistente al debug gestito solo nei casi in cui la chiamata richiede l'interfaccia di classe o l'interfaccia IDispatch predefinita della classe gestita visibile a COM. L'assistente al debug gestito non viene attivato quando la chiamata QueryInterface è destinata a un'interfaccia esplicita alla quale è applicato l'attributo ClassInterfaceAttribute ed è implementata esplicitamente dalla classe visibile a COM.

Sintomi

Viene effettuata una chiamata QueryInterface da codice nativo che restituisce l'errore COR_E_INVALIDOPERATION HRESULT. L'errore HRESULT potrebbe essere causato dal fatto che Common Language Runtime non consente chiamate QueryInterface che comporterebbero l'attivazione di questo assistente al debug gestito.

Causa

Per evitare potenziali problemi di controllo delle versioni, il runtime non consente chiamate QueryInterface per l'interfaccia di classe o l'interfaccia IDispatch predefinita di una classe visibile a COM, che deriva da una classe non visibile a COM. Ad esempio, se sono stati aggiunti membri pubblici alla classe di base non visibile a COM, i client COM esistenti che usano la classe derivata potrebbero interrompersi, perché la vtable della classe derivata, che contiene i membri della classe di base, verrebbe alterata da una 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 applicarvi l'attributo ClassInterfaceAttribute.

Effetto sull'ambiente di esecuzione

L'assistente al debug gestito non ha alcun effetto su CLR.

Output

Di seguito è riportato un messaggio di esempio relativo a una chiamata QueryInterface su una classe Derived visibile a COM che deriva da una classe Base non visibile a 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.

Impostazione

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

Vedi anche