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

Использование в реальном мире Reflection.Emit

Во всех книгах, которые я читал об отражении, они часто говорят, что не так много случаев, когда вы хотите генерировать ИЛ на лету, но они не дают примеров того, где это имеет смысл.

После просмотра Reflection.Emit как требования к заданию для игровой компании мне было любопытно, где еще она используется.

Теперь мне интересно, есть ли ситуации, которые вы видели в реальном мире, это было лучшее решение проблемы. Возможно, он используется как реализация для шаблона проектирования?

Примечание Я предполагаю, что PostSharp/AOP использует его.

4b9b3361

Ответ 1

Expression.Compile сути, делает это - это ключ к некоторым LINQ.

В настоящее время я использую рефлексию emit для перезаписи API сериализации - потому что иногда рефлексия просто недостаточно хороша. Как это случается, это также позволит ему генерировать dll (очень похоже на то, как работает sgen), позволяя полностью статический код (я надеюсь, это сделает его дружественным для iPhone).

Я также использую подобный подход в HyperDescriptor, чтобы обеспечить очень быстрый поиск свойств на основе имен.

Я также использовал emit для таких вещей:

все связанные с ТАКИМИ вопросами.

Наконец, этот подход IL является ядром protobuf-net "v2"; причина в том, что он позволяет мне иметь быструю модель во время выполнения (компилировать ее через IL на лету) и записывать ее напрямую в статически скомпилированную dll, чтобы она работала на таких вещах, как iPhone, Phone 7 и т.д. (в которых отсутствуют необходимые API метапрограммирования).

Ответ 2

Динамическое создание mock object, который реализует некоторый интерфейс. Примеры фреймворков, которые делают это: moq, rhino mocks.

Ответ 3

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

В любое время, когда вы хотите динамически "писать код" (т.е. создавать новую функцию и т.д.), вам понадобится Emit.

Ответ 4

Замок DynamicProxy использует его, как вы думаете, динамические прокси. Затем DynamicProxy используется контейнером Castle IoC Windsor и OR для сопоставления ActiveRecord.

Ответ 5

Языки, связанные с DLR и DLR, в значительной степени зависят от Reflection.Emit

Ответ 6

Я помню, как Relection.Emit использовался в главе 8: "Генерация кода" на лету "для обработки изображений" Красивый код. В основном автор специализируется на выполнении определенного набора операций обработки изображений на заданном изображении, что в свою очередь приводит к значительному сокращению времени выполнения.

Ответ 7

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

Создав вспомогательный класс во время выполнения, который генерирует код для доступа к свойству, полученный код был на порядок быстрее, чем исходный код только для отражения.

Ответ 9

В Mocking-библиотеках также используется Reflection.Emit для создания прокси-серверов, используемых в Unit Testing.

Ответ 10

Недавно я использовал его для создания доказательства концепции для составления набора операций, которые очень дорого выполнялись во время выполнения, и достигли 200% -ного улучшения скорости. Операции состояли в том, чтобы использовать RegEx для синтаксического анализа большой строки и перебора совпадений, использовать Reflection для поиска и создания типов экземпляров, а также множество других вещей, которые не так быстро. Используя IL emit, я создал динамические функции, которые соответствовали типу делегата (используя DynamicMethod) и кэшировали их. Я выполнил обычный танец RegEx/Reflection один раз за входное значение, чтобы выяснить, что он должен делать, а затем использовал StringBuilder для объединения строк как литералов, а вместо Reflection/Activator теперь я мог бы использовать сами фактические типы в испускаемом IL. Вот полезный совет: не пытайтесь писать IL самостоятельно, если вы не садомазохист. Напишите образец функции или введите С#, который делает то, что вы хотите, скомпилируйте его и используйте Reflector или ILDASM, чтобы увидеть сгенерированный IL. Затем используйте Emit для выполнения аналогичной логики. Еще один совет: вы можете создавать локали и хранить их в переменных, а затем использовать Emit (OpCodes.Ldloc, myLocalVar), и он получит локальный адрес для вас, вместо того, чтобы отслеживать локальный индекс (например, ldloc_1).

Ответ 12

  1. Создайте декларативный код, например, используйте интерфейс для объявления базовой службы HTTP REST. https://github.com/neurospeech/retro-core-fit

  2. Повышение производительности, большую часть времени я использую Expression.Compile для создания фрагмента кода для быстрого получения информации путем компиляции выражения выражения для скомпилированного делегата, который может быть выполнен в будущем. Если вы используете PropertyInfo.GetValue, это очень медленно, но если вы создаете выражение для доступа к свойству и компилируете его для делегата (который внутренне использует Reflection.Emit), это значительно экономит время ЦП.

Ответ 13

Reflection.Emit пространство имен используется для разработки LinqPad.It помогает динамически создавать типизированные Datacontexts. Посмотрите эту ссылку http://www.linqpad.net/HowLINQPadWorks.aspx.

Ответ 14

Мне нравится больше изучать AI-Inspired для самообучения. Это позволяет нам создавать класс или модуль во время выполнения

Ответ 15

Например, Entity Framework использует Reflection.Emit для создания прокси-классов во время выполнения, которые наследуют ваши классы моделей для обеспечения ленивой загрузки и отслеживания изменений.

Ответ 16

Генерация перечислений из внешних данных:

Динамическое перечисление в С#

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

Ответ 17

Я на самом деле разрабатываю свой собственный язык и создаю его компилятор с использованием С# Reflection.Emit.
Кто-то может подумать, что сборка компилятора с использованием С# нехороша, но на самом деле все работает хорошо, а производительность во время компиляции достаточно хороша. Я опубликую его на GitHub, когда закончу.