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>