Dela via


nonComVisibleBaseClass MDA

Kommentar

Den här artikeln är specifik för .NET Framework. Det gäller inte för nyare implementeringar av .NET, inklusive .NET 6 och senare versioner.

Den nonComVisibleBaseClass hanterade felsökningsassistenten (MDA) aktiveras när ett QueryInterface anrop görs av intern eller ohanterad kod på COM-anropsbar omslutning (CCW) för en COM-synlig hanterad klass som härleds från en basklass som inte är COM synlig. Anropet QueryInterface gör att MDA endast aktiveras i fall där anrop begär klassgränssnittet eller standardvärdet IDispatch för den COM-synliga hanterade klassen. MDA aktiveras inte när QueryInterface är för ett explicit gränssnitt som har ClassInterfaceAttribute attributet tillämpat och uttryckligen implementeras av com-visible-klassen.

Symtom

Ett QueryInterface anrop från inbyggd kod som misslyckas med en COR_E_INVALIDOPERATION HRESULT. HRESULT kan bero på att körningen inte tillåter QueryInterface anrop som skulle orsaka aktiveringen av denna MDA.

Orsak

Körningen kan inte tillåta QueryInterface anrop för klassgränssnittet eller standardgränssnittet IDispatch för en COM-synlig klass som härleds från en klass som inte är COM-synlig på grund av potentiella versionsproblem. Om några offentliga medlemmar till exempel lades till i basklassen som inte är COM-synliga kan befintliga COM-klienter som använder den härledda klassen eventuellt brytas eftersom den virtuella tabellen för den härledda klassen, som innehåller basklassmedlemmarna, skulle ändras genom en sådan ändring. Explicita gränssnitt som exponeras för COM har inte det här problemet eftersom de inte innehåller basmedlemmarna i gränssnitten i den virtuella datorn.

Åtgärd

Exponera inte klassgränssnittet. Definiera ett explicit gränssnitt och tillämpa attributet på ClassInterfaceAttribute det.

Effekt på körningen

Denna MDA har ingen effekt på CLR.

Output

Följande är ett exempelmeddelande för ett QueryInterface anrop på en COM-synlig klass Derived som härleds från en icke-COM-synlig klass 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.

Konfiguration

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

Se även