nonComVisibleBaseClass MDA
Feljegyzés
Ez a cikk a .NET-keretrendszer vonatkozik. Ez nem vonatkozik a .NET újabb implementációira, beleértve a .NET 6-os és újabb verzióit.
A nonComVisibleBaseClass
felügyelt hibakeresési segéd (MDA) akkor aktiválódik, ha egy QueryInterface
olyan COM-látható felügyelt osztály COM-hívó burkolóján (CCW) natív vagy nem felügyelt kód indít hívást, amely egy olyan alaposztályból származik, amely nem látható a COM-n. A QueryInterface
hívás hatására az MDA csak olyan esetekben aktiválódik, amikor a hívás a COM-ból látható felügyelt osztály osztályfelületét vagy alapértelmezettét IDispatch
kéri. A rendszer nem aktiválja az MDA-t, ha az QueryInterface
olyan explicit felületre vonatkozik, amely alkalmazza az ClassInterfaceAttribute attribútumot, és amelyet a COM-látható osztály explicit módon implementál.
Hibajelenségek
Natív QueryInterface
kódból érkező hívás, amely egy COR_E_INVALIDOPERATION HRESULT-tal meghiúsul. A HRESULT oka az lehet, hogy a futtatókörnyezet nem engedélyezi QueryInterface
a hívásokat, amelyek ennek az MDA-nak az aktiválását okozzák.
Ok
A futtatókörnyezet nem tudja engedélyezni QueryInterface
a com-visible osztály osztályfelületének vagy alapértelmezett IDispatch
felületének hívását, amely egy olyan osztályból származik, amely a lehetséges verziószámozási problémák miatt nem LÁTHATÓ. Ha például bármely nyilvános tagot hozzáadtak az alaposztályhoz, amely nem COM-látható, a származtatott osztályt használó meglévő COM-ügyfelek esetleg megszakadhatnak, mert az alaposztálytagokat tartalmazó származtatott osztály virtuális tábláját egy ilyen módosítás módosítaná. A COM számára közzétett explicit felületek nem rendelkeznek ezzel a problémával, mert nem tartalmazzák az interfészek alaptagjait a virtuális táblában.
Resolution (Osztás)
Ne tegye elérhetővé az osztály felületét. Definiáljon explicit felületet, és alkalmazza rá az ClassInterfaceAttribute attribútumot.
Effektus a futtatókörnyezetre
Ez az MDA nincs hatással a CLR-re.
Hozam
Az alábbiakban egy nem COM-látható osztályból Derived
Base
származó COM-beli hívásra vonatkozó példaüzenet QueryInterface
látható.
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.
Konfiguráció
<mdaConfig>
<assistants>
<nonComVisibleBaseClass />
</assistants>
</mdaConfig>