Получить список файлов в решении / проекте с помощью консольного приложения DXCore
Я понимаю, что следующие фрагменты могут быть использованы для извлечения информации о решении VS при использовании в плагине.
EnvDTE.Solution solution = CodeRush.ApplicationObject.Solution;
EnvDTE.Projects projects = solution.Projects;
Q: Я хотел бы создать консольное приложение и получить доступ к этим данным файла. Моя цель - создать консольное приложение (которое можно запустить без VS), чтобы сгенерировать отчет, основанный на проблемах проектирования, которые я обнаружил во входном файле.sln. Какие функции я использую для этого?
1 ответ
Оригинальный (и обновленный) пост находится здесь.
На самом деле DXCore не предназначен для использования вне Visual Studio, но всегда есть обходные пути... В этой статье я собираюсь показать вам, как использовать DXCore Framework в обычном консольном приложении C# для анализа всего решения и работать с абстрактным разобранным деревом. Решение должно быть передано в качестве аргумента программе в виде полного полного пути к файлу *.sln. Если аргумент не используется, используется жестко заданный путь к тестовой программе, поэтому программа проанализирует себя и напечатает информацию о решении, такую как список всех используемых типов и количество членов внутри каждого класса.
Давайте создадим новое консольное приложение C#, назовем его TestDXCoreConsoleApp и сохраним его в папке "C:\Project":
Затем мы должны изменить версию Target Framework нового проекта на Framework 4.0, так что это не "Профиль клиента Target Framework 4.0", потому что некоторые обязательные ссылки на сборки не поддерживают эту версию Target Framework:
Теперь давайте добавим необходимые ссылки на сборки. Вот список того, что нам нужно:
1) сборки DXCore:
- DevExpress.CodeRush.Common
- DevExpress.CodeRush.Core
- DevExpress.CodeRush.StructuralParser
- DevExpress.CodeRush.VSCore
- DevExpress.DXCore.AssemblyResolver
- DevExpress.DXCore.Parser
Эти сборки можно найти в папке установки DevExpress IDE Tools. Например, путь может выглядеть так:
C: \ Program Files \ DevExpress 2011.1 \ IDETools \ System \ DXCore \ BIN
2) Теперь три дополнительных сборки для поддержки различных языков программирования:
- DX_CPPLanguage
- DX_CSharpLanguage
- DX_VBLanguage
С помощью этих сборок мы можем анализировать проекты CSharp, Visual Basic и C++. Их можно найти здесь:
C: \ Program Files (x86) \ DevExpress 2011.1 \ IDETools \ System \ DXCore \ BIN \ SYSTEM
3) Сборки.NET Framework:
- Microsoft.Build.BuildEngine.dll
4) И, наконец, пара сборок Visual Studio:
- EnvDTE
- VsLangProj
Эти два можно найти в папке "PublicAssemblies":
C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ PublicAssemblies \
Теперь код поддержки DXCore. Этот код необходим для загрузки решения, его проектов и инициализации анализаторов DXCore. Я добавил две папки:
1) Папка Helpers содержит следующие классы:
- LanguageHelper.cs - определяет язык проектов (например, CSharp, Visual Basic или C++).
- ParserHelper.cs - инициализирует парсеры DXCore и несколько важных сервисов DXCore - сервис Source Model и сервис Language, которые используются для анализа исходного кода.
- SolutionParser.cs - вспомогательный класс, который принимает путь к решению, которое вы собираетесь анализировать. Вызов метода GetParsedSolution вернет SolutionElement, который содержит абстрактное исходное дерево всего решения.
2) Папка Loaders содержит проект Visual Studio и загрузчики решений для разных версий Visual Studio. Они используются для анализа файлов *.XXproj и *.sln. Существуют версии для VS2002, VS2003 и VS2005. Для VS2008 и VS2010 нет специальных загрузчиков, потому что эти загрузчики для старых версий VS идеально подходят для чтения и загрузки более новых файлов проекта Visual Studio и файлов формата решения (например, 2008, 2010).
Вот окончательная структура TestDXCoreConsoleApp:
TestDXCoreConsoleApp с полным исходным кодом находится здесь (267 457 байт, C#, VS2010), поэтому вы можете просмотреть код и использовать его по своему усмотрению. Вот основная функция класса Program:
static void Main(string[] args)
{
string SolutionPath;
if (args != null && args.Length > 0)
SolutionPath = args[0];
else
SolutionPath = @"c:\Projects\TestDXCoreConsoleApp\TestDXCoreConsoleApp.sln";
try
{
ParserHelper.RegisterParserServices();
Console.Write("Parsing solution... ");
SolutionParser solutionParser = new SolutionParser(SolutionPath);
SolutionElement solution = solutionParser.GetParsedSolution();
if (solution == null)
return;
Console.WriteLine("Done.");
foreach (ProjectElement project in solution.AllProjects)
foreach (SourceFile file in project.AllFiles)
foreach (TypeDeclaration type in file.AllTypes)
{
Console.Write(type.FullName);
Console.WriteLine(", members: " + ((ITypeElement)type).Members.Count);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
ParserHelper.UnRegisterParserServices();
}
Console.ReadLine();
}
Если вы поместите исходные коды в папку "C:\Projects" и запустите программу без каких-либо аргументов, вы должны увидеть следующий результат:
Нажмите клавишу Enter, чтобы закрыть окно. Помните, что процесс анализа может занять некоторое время, поэтому вам может потребоваться подождать несколько секунд, пока не будет проанализировано все решение.