@Vinod, чтобы исправить исключение с помощью ParserServices.ProfilingService, откройте ParserHelper.cs и поместите эти строки кода в метод RegisterParserServices (): IProfilingService lProfiling = (IProfilingService) CreateParserService (typeof (ProfilingServices)); ParserServices.RegisterProfilingService (lProfiling); И не забудьте поместить эту строку кода в метод UnRegisterParserServices (): ParserServices.UnregisterProfilingService ();

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

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

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

 Alex Skorkin31 мая 2011 г., 13:12
Вне IDE DXCore может анализировать файлы (или целое решение), поэтому вы можете перечислять элементы решения, получать их характеристики (например, метрики кода) и генерировать код. Однако вы не можете использовать API-интерфейсы DXCore для изменения файлов, и никакие службы DXCore не будут доступны (доступны через методы CodeRush.XXX). С другой стороны, сервисы DXCore можно эмулировать, но их необходимо полностью переписать. Я собираюсь создать на своем сайте сообщение в блоге о том, как использовать DXCore вне Visual Studio. Это потребует написания большого количества кода, которым я также поделюсь, если все пойдет как положено.
 Reniuz30 мая 2011 г., 18:07
И вопрос в том ...?
 Alex Skorkin30 мая 2011 г., 18:44
Это довольно сложная задача, поскольку DXCore не предназначен для использования вне среды Visual Studio.
 Shaun31 мая 2011 г., 10:21
Спасибо, Алекс. Но я также могу использовать большинство функций в консольном приложении. Я могу последовательно анализировать несколько файлов, но я хотел ввести файл решения, а затем работать со всеми файлами в нем. Можете ли вы дать представление о том, насколько сложной может быть задача? Спасибо
 Shaun30 мая 2011 г., 18:14
Я хотел бы указать местоположение решения и получить доступ ко всем его файлам проекта как консольное приложение, а не как плагин (библиотека классов)

Ответы на вопрос(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.CommonDevExpress.CodeRush.CoreDevExpress.CodeRush.StructuralParserDevExpress.CodeRush.VSCoreDevExpress.DXCore.AssemblyResolverDevExpress.DXCore.Parser

Эти сборки можно найти в папке установки DevExpress IDE Tools. Например, путь может выглядеть так:

C: \ Program Files \ DevExpress 2011.1 \ IDETools \ System \ DXCore \ BIN

2) Теперь три дополнительных сборки для поддержки разных языков программирования:

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

EnvDTEVsLangProj

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

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();
}

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

Спасибо Алекс за обходной путь. Я мог бы работать с ним и получить ожидаемые результаты. Он отлично работает с VS2008 с .NET 3.5 с DXCore 10.2.6. Вы указали на использование .NET 4, это имеет какое-то значение? Еще раз спасибо.

 Alex Skorkin07 июн. 2011 г., 20:50
@Shaun Я не совсем уверен, что это за награда - я просто проверял это. В FAQ по StackOverflow есть некоторая информация о «награде».
 Shaun07 июн. 2011 г., 14:08
@Shaun Без разницы - он будет работать с любой версией VS.
 Shaun07 июн. 2011 г., 14:04
@Alex. Я видел награду +50 на ваш ответ. Я совершенно новичок в StackOverflow, как мне его использовать?
 Alex Skorkin22 июн. 2011 г., 20:34
Получить список файлов в решении / проекте с помощью консольного приложения D
 Alex Skorkin07 июн. 2011 г., 20:54
@Vinod, чтобы исправить исключение с помощью ParserServices.ProfilingService, откройте ParserHelper.cs и поместите эти строки кода в метод RegisterParserServices (): IProfilingService lProfiling = (IProfilingService) CreateParserService (typeof (ProfilingServices)); ParserServices.RegisterProfilingService (lProfiling); И не забудьте поместить эту строку кода в метод UnRegisterParserServices (): ParserServices.UnregisterProfilingService ();

Ваш ответ на вопрос