Исходное (и обновленное) сообщение находится здесь .
На самом деле 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:
Эти два файла можно найти в папке «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, чтобы закрыть окно. Помните, что процесс синтаксического анализа может занять некоторое время, поэтому вам может потребоваться подождать несколько секунд, пока не будет проанализировано все решение.