【问题标题】:Get a list of files in a Solution/Project using DXCore console application使用 DXCore 控制台应用程序获取解决方案/项目中的文件列表
【发布时间】:2011-05-30 15:18:25
【问题描述】:

我了解以下 sn-ps 可用于在插件中使用时提取 VS 解决方案信息。

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

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

【问题讨论】:

  • 我想提供解决方案的位置,并以控制台应用程序而不是插件(类库)的形式访问其所有项目文件
  • 这是一项相当复杂的任务,因为 DXCore 不是为在 Visual Studio 环境之外使用而设计的。
  • 谢谢亚历克斯。但我也可以在控制台应用程序中使用大多数功能。我能够按顺序解析多个文件,但我想输入一个解决方案文件,然后使用其中的所有文件。你能想象一下这个任务有多复杂吗?谢谢
  • 在 IDE 之外,DXCore 可以解析文件(或整个解决方案),因此您可以枚举解决方案元素,获取它们的特征(例如代码指标)并生成代码。但是,您不能使用 DXCore API 来更改文件,并且没有可用的 DXCore 服务(可通过 CodeRush.XXX 方法访问)。另一方面,可以模拟 DXCore 服务,但必须完全重写它们。我将在我的网站上创建一篇关于如何在 Visual Studio 之外使用 DXCore 的博客文章。这将需要编写大量代码,如果一切按预期进行,我也会分享这些代码。
  • @Alex。在 VS 之外使用 DXCore 也会有很大帮助。但是我如何至少可以解析整个解决方案。我尝试了以下方法,但徒劳无功:CSharp30Parser SolnParser = new CSharp30Parser(); fileNode = SolnParser.ParseFile(solnPath) as SolutionElement;您能提出更改建议吗?谢谢

标签: c# plugins coderush dxcore


【解决方案1】:

原始(和更新)帖子位于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 程序集:

  • 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 的最终结构:

具有完整源代码的 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 键关闭窗口。请记住,解析过程可能需要一些时间,因此您可能需要等待几秒钟,直到解析整个解决方案。

【讨论】:

  • 感谢 Alex 的解决方法。我可以使用它并获得预期的输出。它适用于带有 .NET 3.5 和 DXCore 10.2.6 的 VS2008。您曾指出使用 .NET 4,这有什么不同吗?再次感谢。
  • @Alex。我在您的回复中看到了赏金+50。我是 StackOverflow 的新手,如何使用它?
  • @Shaun 我不完全确定赏金是什么——我只是在测试这个东西。 StackOverflow 常见问题解答中有一些关于“赏金”的信息。
  • @Alex:因为我一直在处理您发送的包裹。真的很好。有一个问题,我的解决方案层次结构具有以下结构:Solution heirarchy 项目名称存在冲突,作为字典的实现抛出异常而不解析整个解决方案。我该如何调整它?谢谢
  • @Vinod,要使用 ParserServices.ProfilingService 修复异常,请打开 ParserHelper.cs 并将这些代码行放入 RegisterParserServices() 方法中: IProfilingService lProfiling = (IProfilingService)CreateParserService(typeof(分析服务)); ParserServices.RegisterProfilingService(lProfiling);并且不要忘记将这行代码放入 UnRegisterParserServices() 方法中:ParserServices.UnregisterProfilingService();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
相关资源
最近更新 更多