Как программно анализировать и изменять код C#

Что я хочу сделать, это прочитать код c#, проанализировать его, вставить некоторые вызовы методов и скомпилировать его наконец.

можно ли преобразовать исходный код C# (список строк) в объекты CodeDOM?

6 ответов


Это напрямую невозможно сделать с помощью основной платформы .NET Framework. Вам нужно использовать сторонние или дополнительные инструменты, например:


это действительно старый вопрос, но стоит отметить, что принятый ответ больше не применяется. Последние Рослин проект явно направлен на раскрытие всех знаний, которые компилятор получает о вашей кодовой базе в процессе статического анализа, и предоставление всей этой информации через управляемые API для вас. Он доступен для VB и C#.

поскольку вы хотите использовать информацию статического анализа, вам понадобится Microsoft.CodeAnalysis пакет NuGet (материал, который вам нужен для C#, находится под Microsoft.CodeAnalysis.CSharp namespace) и некоторое время в образцы и пошаговые руководства страница в документы.


попробовать Linq over C#. Это чудесно.


попробовать Mono.Сесил!--2-->


Если вы хотите иметь возможность анализировать и выполнять произвольные анализы и преобразования на исходном коде C# (или на других языках), проверьте наш инструментарий реинжиниринга программного обеспечения DMS.

DMS имеет полный интерфейс c#, строит полные абстрактные синтаксические деревья для разбираемого кода (но не CodeDom), предоставляет полный процедурный API для ходьбы/проверки/изменения ASTs. После пересмотра дерева DMS может регенерировать исходный код, соответствующий измененному дерево, либо в режиме верности, где он пытается сохранить исходный интервал, либо в режиме prettyprint, где он применяет стиль prettyprint, который можно полностью контролировать. Комментарии сохраняются в восстановленном источнике должным образом.

кроме того, DMS обеспечивает сопоставление и преобразование шаблонов исходного уровня (e.g, вы можете написать "x=x+1 ==> x++" вместо того, чтобы кодировать все дерево для проверки, взломать дерево для изменения.) См.запись о преобразованиях программы в поймите, почему это намного меньше работы..


на CSharpCodeProvider может быть то, что вы ищете.