Есть ли официальная замена для 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.