我了解在插件中使用时,可以使用以下代码段提取 VS 解决方案信息。
EnvDTE.Solution solution = CodeRush.ApplicationObject.Solution;
EnvDTE.Projects projects = solution.Projects;
问:我想构建一个控制台应用程序并访问这些文件详细信息。我的目标是创建一个控制台应用程序(可以在没有 VS 的情况下运行)以根据我在输入 .sln 文件中发现的设计问题生成报告。我为此使用什么功能?
原始(和更新的)帖子位于此处。
实际上,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 IDE Tools 安装文件夹中找到。例如,路径可能如下所示:
C:\Program Files\DevExpress 2011.1\IDETools\System\DXCore\BIN
2) 现在,针对不同程序语言支持的三个附加程序集:
通过这些程序集,我们能够解析 CSharp、Visual Basic 和 C++ 项目。它们可以在这里找到:
C:\Program Files (x86)\DevExpress 2011.1\IDETools\System\DXCore\BIN\SYSTEM
3) .NET 框架程序集:
4) 最后,还有几个 Visual Studio 程序集:
这两个可以在“PublicAssemblies”文件夹中找到:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies\
现在,DXCore 支持代码。加载解决方案、其项目和初始化 DXCore 解析器需要此代码。我添加了两个文件夹:
1) Helpers 文件夹包含以下类:
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 类的 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 键关闭窗口。请记住,解析过程可能需要一些时间,因此您可能需要等待几秒钟,直到解析整个解决方案。