nonComVisibleBaseClass – pomocník spravovaného ladění (MDA)
Poznámka:
Tento článek je specifický pro rozhraní .NET Framework. Nevztahuje se na novější implementace .NET, včetně .NET 6 a novějších verzí.
Pomocník nonComVisibleBaseClass
spravovaného ladění (MDA) se aktivuje, když QueryInterface
je volání provedeno nativním nebo nespravovaným kódem na obálku MODELU COM (CCW) viditelné spravované třídy modelu COM, která je odvozena od základní třídy, která není viditelná modelEM COM. Volání QueryInterface
způsobí, že MDA aktivuje pouze v případech, kdy volání požaduje rozhraní třídy nebo výchozí IDispatch
spravovanou třídu modelu COM. MDA není aktivována, pokud QueryInterface
je pro explicitní rozhraní, které má ClassInterfaceAttribute použitý atribut a je explicitně implementováno třídou com-visible.
Příznaky
Volání QueryInterface
z nativního kódu, které selhává s COR_E_INVALIDOPERATION HRESULT HODNOTA HRESULT může být způsobená tím, že modul runtime nepovoluje QueryInterface
volání, která by způsobila aktivaci tohoto MDA.
Příčina
Modul runtime nemůže povolit QueryInterface
volání pro rozhraní třídy nebo výchozí IDispatch
rozhraní třídy viditelné modelu COM, která je odvozena z třídy, která není viditelná modelu COM kvůli potenciálním problémům s verzí. Například pokud byly přidány do základní třídy, které nejsou viditelné modelu COM, stávající klienti modelu COM používající odvozenou třídu by mohli potenciálně přerušit, protože virtuální tabulka odvozené třídy, která obsahuje členy základní třídy, by byla touto změnou změněna. Explicitní rozhraní vystavená modelu COM tento problém nemají, protože nezahrnují základní členy rozhraní ve virtuální tabulce.
Rozlišení
Nezpřístupňujte rozhraní třídy. Definujte explicitní rozhraní a použijte na ClassInterfaceAttribute něj atribut.
Vliv na modul runtime
Tento mdA nemá žádný vliv na CLR.
Výstup
Následuje příklad zprávy pro QueryInterface
volání třídy COM-visible Derived
, která je odvozena z ne-COM-visible třídy 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.
Konfigurace
<mdaConfig>
<assistants>
<nonComVisibleBaseClass />
</assistants>
</mdaConfig>