Как программно разобрать и изменить код C # - PullRequest
10 голосов
/ 03 октября 2009

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

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

Ответы [ 6 ]

6 голосов
/ 05 июня 2015

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

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

6 голосов
/ 03 октября 2009

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

2 голосов
/ 03 октября 2009

Попробуйте Linq над C # . Это прекрасно.

0 голосов
/ 03 октября 2009

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

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

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

0 голосов
/ 03 октября 2009

Попробуйте Mono.Cecil

0 голосов
/ 03 октября 2009

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

...