Получить список файлов в решении / проекте с помощью консольного приложения DXCore - PullRequest
4 голосов
/ 30 мая 2011

Я понимаю, что следующие фрагменты могут использоваться для извлечения информации о решении VS при использовании в плагине.

EnvDTE.Solution solution = CodeRush.ApplicationObject.Solution;
EnvDTE.Projects projects = solution.Projects;

В: Я хотел бы создать консольное приложение и получить доступ к этим данным файла. Моя цель - создать консольное приложение (которое можно запускать без VS), чтобы сгенерировать отчет, основанный на проблемах проектирования, которые я обнаружил во входном файле .sln. Какие функции я использую для этого?

1 Ответ

9 голосов
/ 02 июня 2011

Исходное (и обновленное) сообщение находится здесь .

На самом деле DXCore не предназначен для использования вне Visual Studio, но всегда есть обходные пути ... В этомстатья Я собираюсь показать вам, как использовать DXCore Framework внутри обычного консольного приложения C # для анализа всего решения и работы с абстрактным разобранным деревом.Решение должно быть передано в качестве аргумента программе в виде полного полного пути к файлу * .sln.Если аргумент не используется, используется жестко заданный путь к тестовой программе, поэтому программа проанализирует себя и выведет информацию о решении, такую ​​как список всех используемых типов и количество членов внутри каждого класса.

Давайте создадим новое консольное приложение C #, назовем его TestDXCoreConsoleApp и сохраним его в папке «C: \ Project»:

Creating a new Console App

Затем мы должны изменитьВерсия нового проекта Target Framework для Framework 4.0, поэтому это не «Профиль клиента Target Framework 4.0», поскольку некоторые обязательные ссылки на сборки не поддерживают эту версию Target Framework:

Settings 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:

DXCore ConsoleApp structure

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» и запустите программу без каких-либо аргументов, вы должны увидеть следующий результат:

DXCore Console App result

Нажмите клавишу Enter, чтобы закрыть окно. Помните, что процесс синтаксического анализа может занять некоторое время, поэтому вам может потребоваться подождать несколько секунд, пока не будет проанализировано все решение.

...