nonComVisibleBaseClass MDA
Notitie
Dit artikel is specifiek voor .NET Framework. Dit geldt niet voor nieuwere implementaties van .NET, waaronder .NET 6 en nieuwere versies.
De nonComVisibleBaseClass
beheerde foutopsporingsassistent (MDA) wordt geactiveerd wanneer een QueryInterface
aanroep wordt uitgevoerd door systeemeigen of onbeheerde code op de COM callable wrapper (CCW) van een door COM zichtbare beheerde klasse die is afgeleid van een basisklasse die niet zichtbaar is voor COM. De QueryInterface
aanroep zorgt ervoor dat de MDA alleen wordt geactiveerd in gevallen waarin aanroepen de klasse-interface of de standaardwaarde IDispatch
van de door COM zichtbare beheerde klasse aanvragen. De MDA wordt niet geactiveerd wanneer de QueryInterface
is bedoeld voor een expliciete interface waarop het ClassInterfaceAttribute kenmerk is toegepast en expliciet wordt geïmplementeerd door de COM-zichtbare klasse.
Symptomen
Een QueryInterface
aanroep van systeemeigen code die mislukt met een COR_E_INVALIDOPERATION HRESULT. Het HRESULT kan worden veroorzaakt door het niet toewijzen QueryInterface
van runtime-aanroepen die de activering van deze MDA zouden veroorzaken.
Oorzaak
De runtime kan geen aanroepen toestaan QueryInterface
voor de klasse-interface of standaardinterface IDispatch
van een COM-zichtbare klasse die is afgeleid van een klasse die niet com-zichtbaar is vanwege mogelijke versiebeheerproblemen. Als er bijvoorbeeld openbare leden zijn toegevoegd aan de basisklasse die niet com-zichtbaar is, kunnen bestaande COM-clients die de afgeleide klasse gebruiken, mogelijk worden verbroken omdat de vtable van de afgeleide klasse, die de basisklasseleden bevat, zou worden gewijzigd door een dergelijke wijziging. Expliciete interfaces die aan COM worden blootgesteld, hebben dit probleem niet omdat ze niet de basisleden van interfaces in de vtable bevatten.
Oplossing
Maak de klasse-interface niet beschikbaar. Definieer een expliciete interface en pas het ClassInterfaceAttribute kenmerk erop toe.
Effect op de runtime
Deze MDA heeft geen effect op de CLR.
Uitvoer
Hier volgt een voorbeeldbericht voor een QueryInterface
aanroep van een COM-zichtbare klasse Derived
die is afgeleid van een niet-COM-zichtbare klasse Base
.
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.
Configuratie
<mdaConfig>
<assistants>
<nonComVisibleBaseClass />
</assistants>
</mdaConfig>