Как программно разобрать и изменить код С#

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

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

Ответ 2

Это действительно старый вопрос, но стоит отметить, что принятый ответ больше не применяется. Недавно разработанный Microsoft Roslyn проект нацелен на то, чтобы разоблачить все знания, полученные компилятором о вашей кодовой базе в процессе статического анализа, и разоблачить все эту информацию через управляемые API, чтобы вы могли использовать. Он доступен как для VB, так и для С#.

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

Ответ 3

Попробуйте Linq over С#. Это замечательно.

Ответ 5

Если вам нужна возможность анализировать и выполнять произвольные анализы и преобразования в исходном коде С# (или на разных языках), посмотрите DMS Software Reengineering Toolkit.

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

Кроме того, DMS обеспечивает сопоставление и преобразование на уровне исходного кода (например, вы можете написать "x = x + 1 == > x ++" вместо того, чтобы кодировать все элементы "walk-around-tree-to-verify", взломать дерево для изменения.) См. запись на программные преобразования, чтобы понять, почему это намного меньше работает.