Delen via


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>

Zie ook