Поделиться через


Помощник по отладке управляемого кода nonComVisibleBaseClass

Обновлен: Ноябрь 2007

Помощник по отладке управляемого кода (MDA) nonComVisibleBaseClass активируется в случае, если вызов класса QueryInterface выполняется машинным или управляемым кодом посредством вызываемой оболочки СОМ (CCW) или управляемого класса, к которому имеет доступ СОМ, производного из базового класса, к которому СОМ не имеет доступа. Вызов класса QueryInterface активирует помощник по отладке управляемого кода только в тех случаях, когда вызов запрашивает интерфейс класса или интерфейс IDispatch по умолчанию для управляемого класса, доступного для модели СОМ. Помощник по отладке управляемого кода не активируется, если класс QueryInterface предназначен для явного интерфейса, к которому применен атрибут ClassInterfaceAttribute, и этот интерфейс реализован явным образом классом, к которому имеет доступ модель СОМ.

Признаки

Вызов класса QueryInterface, выполненный из машинного кода, завершается сбоем со значением COR_E_INVALIDOPERATION для HRESULT. HRESULT может возникнуть в результате того, что среда выполнения не разрешает выполнение вызовов QueryInterface, которые активируют данный помощник по отладке управляемого кода.

Причина

Вследствие вероятного конфликта версий, среда выполнения не может разрешить выполнение вызова QueryInterface для интерфейса класса или интерфейса IDispatch, используемого по умолчанию в доступном для модели COM классе, производном от класса, к которому СОМ не имеет доступа. Например, если к базовому классу, к которому не имеет доступа модель СОМ, добавляются открытые члены, в существующих СОМ-клиентах, использующих производный класс, вероятен сбой. Причина сбоя заключается в том, что таблица виртуальных методов производного класса, содержащая члены базового класса, будет изменена под влиянием подобных изменений. Явные интерфейсы, предоставленные СОМ, не сталкиваются с подобной проблемой, поскольку они не включают базовые члены интерфейсов в таблицу виртуальных методов.

Решение

Не следует предоставлять интерфейс класса. Необходимо определить явный интерфейс и применить к нему атрибут ClassInterfaceAttribute.

Влияние на среду выполнения

Данный помощник по отладке управляемого кода не оказывает влияния на среду CLR.

Результат

В следующем примере кода показано сообщение для вызова интерфейса QueryInterface для класса Derived, к которому имеет доступ модель СОМ, производного от класса 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>

См. также

Основные понятия

Диагностика ошибок посредством управляемых помощников по отладке

Общие сведения о маршалинге взаимодействия

Ссылки

MarshalAsAttribute

Другие ресурсы

Взаимодействие