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


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

Примечание.

Эта статья относится к .NET Framework. Он не применяется к более новым реализациям .NET, включая .NET 6 и более поздние версии.

Помощник по отладке управляемого кода (MDA) dirtyCastAndCallOnInterface активируется при попытке выполнения вызова с ранним связыванием посредством виртуальной таблицы в интерфейсе класса, который был отмечен как интерфейс только позднего связывания.

Симптомы

Приложение вызывает нарушение прав доступа или проявляет непредвиденное поведение при размещении вызова с ранним связыванием посредством СОМ в среде CLR.

Причина

Код пытается выполнить вызов с ранним связыванием с помощью виртуальной таблицы через интерфейс класса, отмеченный как интерфейс только позднего связывания. Обратите внимание, что по умолчанию интерфейсы класса определяются как интерфейсы только позднего связывания. Они также могут быть идентифицированы как интерфейсы позднего связывания с помощью атрибута ClassInterfaceAttribute со значением AutoDispatch ([ClassInterface(ClassInterfaceType.AutoDispatch)]).

Разрешение

Рекомендуемое решение состоит в определении явного интерфейса для использования в COM и выполнении вызова клиентов COM через этот интерфейс вместо автоматически созданного интерфейса класса. Кроме того, вызов из COM можно преобразовать в вызов с поздним связыванием посредством IDispatch.

Наконец, возможно идентифицировать класс как AutoDual ([ClassInterface(ClassInterfaceType.AutoDual)]), чтобы разрешить размещение вызовов с ранним связыванием из COM; однако использование AutoDual категорически не рекомендуется из-за ограничений управления версиями, описанных в ClassInterfaceAttribute.

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

Этот помощник отладки управляемого кода не оказывает никакого влияния на среду CLR. Он только сообщает данные о вызовах с ранним связыванием в интерфейсах позднего связывания.

Выходные данные

Имя метода или имя поля, доступного для вызова с ранним связыванием.

Настройка

<mdaConfig>
  <assistants>
    <dirtyCastAndCallOnInterface />
  </assistants>
</mdaConfig>

См. также