原始(和更新)帖子位于here。
实际上,DXCore 并不是为在 Visual Studio 之外使用而设计的,但总有一些变通方法...在本文中,我将向您展示如何在常规 C# 控制台应用程序中使用 DXCore 框架来解析整个解决方案并使用抽象解析树。解决方案应作为参数传递给程序,作为 *.sln 文件的完整路径。如果没有使用参数,则使用测试程序的硬编码路径,因此程序将解析自身并打印有关解决方案的信息,例如使用的所有类型的列表和每个类中的成员数量。
让我们创建一个新的 C# 控制台应用程序,将其命名为 TestDXCoreConsoleApp 并将其保存在“C:\Project”文件夹中:
然后,我们应该将新项目的 Target Framework 版本更改为 Framework 4.0,因此它不是“Target Framework 4.0 Client Profile”,因为某些必需的程序集引用不支持此版本的 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_VB语言
通过这些程序集,我们能够解析 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 服务 - 用于解析源代码的源模型服务和语言服务。
- SolutionParser.cs - 一个帮助类,它获取您要解析的解决方案的路径。调用 GetParsedSolution 方法将返回 SolutionElement,它保存了整个解决方案的抽象源树。
2) Loaders 文件夹包含适用于不同 Visual Studio 版本的 Visual Studio 项目和解决方案加载器。它们用于解析 *.XXproj 和 *.sln 文件。有 VS2002、VS2003 和 VS2005 的版本。 VS2008 和 VS2010 没有专用的加载器,因为旧 VS 版本的加载器非常适合读取和加载较新的 Visual Studio 项目和解决方案格式文件(例如 2008、2010)。
这是 TestDXCoreConsoleApp 的最终结构:
具有完整源代码的 TestDXCoreConsoleApp 是 here(267,457 字节,C#,VS2010),因此您可以查看代码并根据需要使用它。这是 Program 类的 Main 函数:
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 键关闭窗口。请记住,解析过程可能需要一些时间,因此您可能需要等待几秒钟,直到解析整个解决方案。