Подтвердить что ты не робот

RuntimeBinderInternalCompilerException при динамическом вызове

Я получаю непредвиденное RuntimeBinderInternalCompilerException при передаче объекта в качестве динамического аргумента.

Я попытаюсь объяснить сценарий, так как он слишком вовлечен, чтобы легко вставить код. Я делаю очень странный хакер с Roslyn, так что это будет звучать странно.

  • Выполнить приложение
  • Исходный код монитора для изменений
  • Перекомпилируйте то, что эффективно представляет собой сборка с измененными файлами/классами
  • Загрузите новую скомпилированную сборку в исходный AppDomain
  • Передача существующих экземпляров объектов в новый/измененный код как Динамический, поэтому новый код может работать в существующем состоянии контекста/приложения.

Эта динамическая передача должна работать, потому что тип совместим: например, в моем случае я могу гарантировать, что он имеет функционально соответствующие методы/типы.

Но когда я иду, чтобы выполнить измененный + перезагруженный метод, и он получает объект типа dynamic, я получаю это исключение.

RuntimeBinderInternalCompilerException was unhandled.
An unexpected exception occurred while binding a dynamic operation

В MSDN:

Исключения такого рода отличаются от RuntimeBinderException в том, что RuntimeBinderException представляет собой неспособность связываться в смысле обычная ошибка компилятора, тогда как RuntimeBinderInternalCompilerException представляет собой неисправность самого связующего времени выполнения.

Google не имеет абсолютно никаких результатов для этого. Я не знаю, как отлаживать его дальше. Любые предложения?

(Я выполнил некоторые тесты на песочнице, чтобы убедиться, что я могу загружать разные сборки во время выполнения в тестовое приложение и передавать типы экземпляров из разных сборок в один метод, принимающий динамический параметр, поэтому он работает в этом сценарии.)

4b9b3361

Ответ 1

Трудно ответить на вопрос без каких-либо подробностей, но, читая то, что вы сказали, есть несколько замечаний:

  • Внутренне все имена типов являются полностью квалифицированными. Это означает, что компилятор отклонит ваш код, если вы попытаетесь рассматривать два типа как одно и то же, если они не из одной сборки, с тем же пространством имен и именем. Получение немного разных типов для сетки в .Net сложнее.

  • dynamic не всегда работает так, как вы могли бы интуитивно думать. Если вы играете с компилятором, очень важно изучить, как работает IL, и посмотреть на код и код базового класса, чтобы посмотреть, как они взаимодействуют.

Очень полезным инструментом для низкоуровневой работы .Net является ILSpy: http://ilspy.net/