Есть ли официальная замена для CodeDom?
Я изучаю System.CodeDom
пространство имен для независимого от языка (по крайней мере, в определенных пределах) генерации исходного кода, и у меня есть нашел некоторую информацию, препятствующую использованию CodeDom
.
Я думаю, что некоторые из пропусков, описанных в этот ранний blogpost, были исправлены к настоящему времени и тот факт, что CodeDom
, похоже, не дает возможности создать инструкцию switch
, тем не менее, позволяет делать менее результативные? - обходные пути без угашения публичного интерфейса сгенерированных типов. То же самое относится к автоматическим свойствам С# и инициализаторам коллекции.
Однако другие пропуски не могут быть действительно обработаны, например невозможность создания финализаторов, невозможность объявить расширение методы или , не имеющие прямой поддержки общих ограничений ссылочного типа.
Обратите внимание, что предлагаемые решения с CodeSnippetTypeMember
или инъекции литералов с исходными текстами каким-либо другим способом не удовлетворяют, поскольку они не являются языковыми - независимо - тем самым удаляя всю точку использования CodeDom
, а не String.Format
с буквальными фрагментами кода.
Наконец, в этом вопросе SO даже предлагается , что "CodeDom является провалом и что деревья выражений (или, скорее," Statement "Trees) - это путь вперед" , - хотя без объяснения того, как реально получить какой-либо исходный код из дерева выражений (помимо ограничения, которое не могут быть объявлены с деревьями выражений.
Является ли CodeDom по-прежнему методом выбора генерировать исходный код или текущая BCL предлагает какую-либо неясную замену с именем, о котором я не думал?
Ответы
Ответ 1
Я думаю, что CodeDom по-прежнему остается лучшим решением в BCL сегодня, но: проект Roslyn далеко продвинулся и уже запустил несколько CTP. Цель состоит в том, чтобы сделать компилятор доступным как услугу, и это позволит сценариям генерации кода и проверки кода с помощью простого API.
Взгляните на него, если вы можете использовать бит перед выпуском для своего проекта: Roslyn CTP. Вот связанная (хотя и устаревшая, но еще некоторая хорошая информация) вопрос StackOverflow: Microsoft Roslyn против CodeDom. И, наконец, статья, в которой рассказывается об использовании Roslyn для генерации кода: Генерация кода в .NET с помощью Roslyn CTP
Ответ 2
Нет. CodeDom полезен для генерации кода для выполнения. Его способность генерировать текст также была просто случайным побочным продуктом, потому что компиляторы нуждаются в тексте. Если вы действительно заботитесь о тексте, тогда есть много причин не любить CodeDom и ничего в рамках, чтобы помочь вам.
Другие решения также сфокусированы на генерации исполняемого кода. Reflection.Emit генерирует IL, универсальный язык в .NET, но не предлагает простой способ декомпиляции, хотя, безусловно, может помочь любой достойный декомпилятор (ILSpy, Reflector и т.д.). Linq.Expressions - это чистый исполняемый код и обычно не полезен для создания полных программ. Рослин сильно склонен к тому, что уже имеет текст.
Наверное, лучший способ продвижения - отказаться от вашего требования о наличии текста на определенном языке. Все компиляторы .NET имеют одинаковый вывод, все они компилируются в IL. Который ограничивает ваш выбор одним языком жизнеспособным подходом. Из вашего вопроса не ясно, действительно ли это разумное ограничение. Кажется, это общий выбор, я не могу придумать проект, который когда-либо пытался решить ограничения CodeDom. Вид проектов, доступных на codeplex.com, которые нацелены на CodeDom, вместо этого попытаются свести к минимуму боль детализации, требуемую в коде, который использует CodeDom.