Как стать автором
Обновить

Комментарии 16

АСД

Антисептик-стимулятор Дорогова? Пожалуйста, никогда, не называйте так AST.
AST (Association of Surgical Technologists — первое что выдал google.com)?
Но если вы считаете что термин на русском мало употребляемый, согласен на вариант АСД (AST).

А вообще при написании статьи меня сильно мучил вопрос — «Какие термины стоит переводить, а какие нет?». Голосовалку бы устроить…
Да ну ладно уж вам. В этом контексте совершенно понятно, что такое AST, а АСД и правда режет глаз.
Как же Roslyn? Почему про него даже во введении нет?
С языка сняли.
Еще не рассмотрены, помимо Roslyn (хотя он пока не зарелизился), как минимум:
Common Compiler Infrastructure (http://ccimetadata.codeplex.com/)
Mono.Cecil (http://www.mono-project.com/Cecil)
Да, упомянуть про них стоило. Но я писал только про то, с чем работал.

Roslyn мне всегда казался более инструментом для анализа кода, чем для его генерации. Хотя генерировать он может. Но опыта работы с ним у меня нет, поэтому сказать насколько он удобен и производителен я не могу. И он CTP.

Common Compiler Infrastructure действительно предлагает удобные вещи, но я про него не знал. Опять же нет опыта использования, следовательно я только могу пересказать документацию (а я не очень люблю статьи типа «Я пересказал страничку overview своими словами»).

Mono.Cecil тоже не знал и тоже нет опыта.
Для чего всё это нужно и где это может пригодиться?
Самый распространенный вариант — динамический вызов конструкторов и установка значений при написании ORM или InversionOfControl фреймворков.
Генерация proxy-классов (для любых целей), автоматическая реализация интерфейсов для дополнительных оберток с некоторой AOP-логикой, генерация всяческого шаблонного кода (для всяческих фреймворков), duck-typing. Почти все это можно сделать и используя компиляцию (CodeDom), но Reflection.Emit молниеносно быстр, что зачастую вполне его оправдывает.
Я использовал этот подход для генерации сериализаторов игровых классов для передачи по сети.
У игровых классов атрибутами помечены те поля, которые сериализуются и отмечено как они сериализуются — само значение или его дельта, double передается как fixed-int или fixed short и т.п.
При старте игры генерились сериализаторы индивидуальные, а потом уже в программе вызывались.
Еще как вариант при написании слабых событий очень полезно, что бы не использовать тормозную рефлексию при каждом вызове.
Еще добавлю, что использование Reflector'а (или dotPeek'а) совершенно неоценимо. Пишем обычный код, компилируем его, смотрим, что получается в итоге, и делаем похожим образом, не выдумывая свою последовательность CIL-инструкций.
А еще удобнее тут будет LINQPad — пишешь метод, жмешь Execute и сразу читаешь IL код. Никаких накладных действий. Только вот в бесплатной версии программы урезано автодополнение.
Раз было акцентировано внимание, на том что динамические методы собираются сборщиком мусора, то возможно так же стоит указать, что динамические сборки так же могут быть собраны начиная с .NET 4.0 если использовать AssemblyBuilderAccess.RunAndCollect.
Добавил упоминание про AssemblyBuilderAccess.RunAndCollect.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории