Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Note
Dieser Artikel ist spezifisch für .NET Framework. Sie gilt nicht für neuere Implementierungen von .NET, einschließlich .NET 6 und höherer Versionen.
Der nonComVisibleBaseClass verwaltete Debugging-Assistent (Managed Debugging Assistant, MDA) wird aktiviert, wenn ein QueryInterface Aufruf von systemeigenem oder nicht verwaltetem Code im COM-aufrufbaren Wrapper (CCW) einer COM-sichtbaren verwalteten Klasse ausgeführt wird, die von einer Basisklasse abgeleitet wird, die nicht COM sichtbar ist. Der QueryInterface Aufruf bewirkt, dass der MDA nur in Fällen aktiviert wird, in denen aufruft die Klassenschnittstelle oder die Standardeinstellung IDispatch der com-sichtbaren verwalteten Klasse anfordert. Die MDA wird nicht aktiviert, wenn es QueryInterface sich um eine explizite Schnittstelle handelt, auf die das ClassInterfaceAttribute Attribut angewendet wurde und explizit von der COM-sichtbaren Klasse implementiert wird.
Symptome
Ein QueryInterface Aufruf aus systemeigenem Code, der mit einem COR_E_INVALIDOPERATION HRESULT fehlschlägt. Das HRESULT kann darauf zurückzuführen sein, dass die Laufzeit QueryInterface aufruft, die die Aktivierung dieser MDA verursachen würde.
Ursache
Die Laufzeit kann keine Aufrufe für die Klassenschnittstelle oder standardschnittstelle IDispatch einer COM-sichtbaren Klasse zulassenQueryInterface, die von einer Klasse abgeleitet wird, die aufgrund potenzieller Versionsverwaltungsprobleme nicht COM-sichtbar ist. Wenn beispielsweise öffentliche Member der Basisklasse hinzugefügt wurden, die nicht COM-sichtbar ist, könnten vorhandene COM-Clients, die die abgeleitete Klasse verwenden, möglicherweise unterbrechen, da die vtable der abgeleiteten Klasse, die die Basisklassenmember enthält, durch eine solche Änderung geändert würde. Explizite Schnittstellen, die com zur Verfügung stellen, haben dieses Problem nicht, da sie nicht die Basismmber der Schnittstellen in der vtable enthalten.
Auflösung
Machen Sie die Klassenschnittstelle nicht verfügbar. Definieren Sie eine explizite Schnittstelle, und wenden Sie das ClassInterfaceAttribute Attribut darauf an.
Effekt auf die Laufzeit
Diese MDA hat keine Auswirkungen auf die CLR.
Output
Im Folgenden sehen Sie eine Beispielmeldung für einen QueryInterface Aufruf einer COM-sichtbaren Klasse Derived , die von einer nicht com-sichtbaren Klasse Baseabgeleitet 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>