Pull to refresh

Comments 16

АСД

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

А вообще при написании статьи меня сильно мучил вопрос — «Какие термины стоит переводить, а какие нет?». Голосовалку бы устроить…
Да ну ладно уж вам. В этом контексте совершенно понятно, что такое AST, а АСД и правда режет глаз.
Еще не рассмотрены, помимо 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 код. Никаких накладных действий. Только вот в бесплатной версии программы урезано автодополнение.
UFO just landed and posted this here
Добавил упоминание про AssemblyBuilderAccess.RunAndCollect.
Sign up to leave a comment.

Articles