Freigeben über


nonComVisibleBaseClass-MDA

Aktualisiert: November 2007

Der nonComVisibleBaseClass-MDA (Managed Debugging Assistant, Assistent für verwaltetes Debuggen) wird aktiviert, wenn durch verwalteten oder nicht verwalteten Code ein QueryInterface-Aufruf für den COM Callable Wrapper einer in COM sichtbaren verwalteten Klasse erfolgt, die von einer in COM nicht sichtbaren Basisklasse abgeleitet ist. Der QueryInterface-Aufruf führt nur in den Fällen zur Aktivierung des MDA, in denen der Aufruf die Klassenschnittstelle oder den Standard-IDispatch der in COM sichtbaren verwalteten Klasse anfordert. Der MDA wird nicht aktiviert, wenn mit dem QueryInterface-Aufruf eine explizite Schnittstelle angefordert wird, auf die das ClassInterfaceAttribute-Attribut angewendet wurde und die von der in COM sichtbaren Klasse explizit implementiert wird.

Symptome

Ein QueryInterface-Aufruf aus systemeigenem Code, der zu einem HRESULT COR_E_INVALIDOPERATION führt. Das HRESULT ist möglicherweise darauf zurückzuführen, dass die Laufzeit QueryInterface-Aufrufe sperrt, die zur Aktivierung dieses MDA führen würden.

Ursache

Aufgrund von potenziellen Versionsproblemen kann die Laufzeit keine QueryInterface-Aufrufe für die Klassenschnittstelle oder die IDispatch-Standardschnittstelle einer in COM sichtbaren Klasse zulassen, die von einer nicht in COM sichtbaren Klasse abgeleitet ist. Beispiel: Falls der nicht in COM sichtbaren Basisklasse öffentliche Member hinzugefügt werden, wird die Konsistenz des Codes von vorhandenen COM-Clients, die die abgeleitete Klasse verwenden, möglicherweise zerstört, weil die vtable der abgeleiteten Klasse, die die Member der Basisklasse enthält, hierbei geändert würde. Bei expliziten Schnittstellen, die für COM verfügbar gemacht wurden, tritt dieses Problem nicht auf, weil deren vtable die Basismember der Schnittstellen nicht enthält.

Lösung

Machen Sie die Klassenschnittstelle nicht verfügbar. Definieren Sie eine explizite Schnittstelle, und wenden Sie das ClassInterfaceAttribute-Attribut auf die Schnittstelle an.

Auswirkungen auf die Laufzeit

Dieser MDA hat keine Auswirkungen auf die CLR.

Ausgabe

Im Folgenden finden Sie eine Beispielmeldung für einen QueryInterface-Aufruf für die in COM sichtbare Derived-Klasse, die von der nicht in COM sichtbaren Base-Klasse abgeleitet ist.

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. 

Konfiguration

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

Siehe auch

Konzepte

Diagnostizieren von Fehlern mit Assistenten für verwaltetes Debuggen

Übersicht über das Interop-Marshalling

Referenz

MarshalAsAttribute

Weitere Ressourcen

Interoperabilität