4

我了解在插件中使用时,可以使用以下代码段提取 VS 解决方案信息。

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

问:我想构建一个控制台应用程序并访问这些文件详细信息。我的目标是创建一个控制台应用程序(可以在没有 VS 的情况下运行)以根据我在输入 .sln 文件中发现的设计问题生成报告。我为此使用什么功能?

4

1 回答 1

9

原始(和更新的)帖子位于此处

实际上,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 框架程序集:

  • 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 服务 - 用于解析源代码的源模型服务和语言服务。
  • 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 结构

带有完整源代码的 TestDXCoreConsoleApp 在这里(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”文件夹并在没有指定任何参数的情况下运行程序,您应该会看到以下结果:

DXCore 控制台应用程序结果

按 Enter 键关闭窗口。请记住,解析过程可能需要一些时间,因此您可能需要等待几秒钟,直到解析整个解决方案。

于 2011-06-02T19:23:22.897 回答