nonComVisibleBaseClass MDA
Примечание.
Эта статья относится к .NET Framework. Он не применяется к более новым реализациям .NET, включая .NET 6 и более поздние версии.
Помощник по отладке управляемого кода (MDA) nonComVisibleBaseClass
активируется при вызове QueryInterface
машинным или управляемым кодом в вызываемой оболочке COM (CSW) видимого для COM управляемого класса, производного от базового класса, невидимого для COM. Вызов QueryInterface
приводит к активации MDA только в тех случаях, когда вызов запрашивает интерфейс класса или IDispatch
по умолчанию управляемого класса, видимого для COM. MDA не активируется, когда QueryInterface
предназначен для явного интерфейса, который имеет примененный атрибут ClassInterfaceAttribute и явно реализован классом, видимым для COM.
Симптомы
Вызов QueryInterface
выполняется из машинного кода, в котором произошел сбой со значением COR_E_INVALIDOPERATION HRESULT. Значение HRESULT может возникнуть из-за того, что среда выполнения не разрешает вызовы QueryInterface
, которые активируют данный MDA.
Причина
Среда выполнения не может разрешить вызовы QueryInterface
интерфейса класса или интерфейса IDispatch
по умолчанию видимого для COM класса, производного от класса, невидимого для COM, из-за потенциальных проблем управления версиями. Например, если какие-либо открытые члены были добавлены в базовый класс, невидимый для COM, то существующие клиенты COM, использующие производный класс, могут прерваться, поскольку виртуальная таблица производного класса, содержащая члены базового класса, будет изменена в результате такой модификации. Явные интерфейсы, предоставляемые в COM, не имеют таких проблем, так как они не включают базовые члены интерфейсов в виртуальной таблице.
Разрешение
Не предоставляйте интерфейс класса. Определите явный интерфейс и примените к нему атрибут ClassInterfaceAttribute.
Влияние на среду выполнения
Этот помощник отладки управляемого кода не оказывает никакого влияния на среду CLR.
Выходные данные
Далее приводится пример сообщения для вызова QueryInterface
в видимом для COM классе Derived
, производном от невидимого для COM класса 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.
Настройка
<mdaConfig>
<assistants>
<nonComVisibleBaseClass />
</assistants>
</mdaConfig>