Megosztás a következőn keresztül:


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 DerivedBaseszá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>

Lásd még