【问题标题】:Get a list of Solution/Project Files for VS Add-in or DXCore Plugin获取 VS 插件或 DXCore 插件的解决方案/项目文件列表
【发布时间】:2009-09-16 18:33:42
【问题描述】:

我正在尝试为 Visual Studio 编写一个加载项,除其他外,它需要跟踪 Visual Studio 解决方案中的每个文件。我知道我需要订阅哪些事件(当打开解决方案时,在其中添加/删除/编辑文件时,对于项目等也是如此),但我不明白如何实际获取文件列表从任何一个。

我最近安装了 CodeRush,并且一直在使用 DXCore 框架。我对它在插件方面的方法感到非常满意,但我仍然看不到在解决方案中获取文件列表的明显方法。

总结一下:我如何通过 Visual Studio SDK DXCore 获得解决方案及其项目中的可靠文件列表? p>

【问题讨论】:

    标签: c# plugins add-in visual-studio-sdk dxcore


    【解决方案1】:

    谢谢,里德;您链接的文章让我走得很远,可以在几分钟内完成概念验证。

    由于我觉得它是相关的,这里是我收集 ProjectItems 的迭代和递归方式。我在 DXCore 中这样做了,但同样的想法也适用于原始的 Visual Studio SDK(DXCore 只是 SDK 的一个更好看的包装器)。 'Solution'、'Projects'、'Project' 和 'ProjectItem' 对象就在 EnvDTE 中。

    设置项目

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

    迭代项目以提取 ProjectItems

    var projects = myProjects.GetEnumerator();
    while (projects.MoveNext())
    {
        var items = ((Project)projects.Current).ProjectItems.GetEnumerator();
        while (items.MoveNext())
        {
            var item = (ProjectItem)items.Current;
            //Recursion to get all ProjectItems
            projectItems.Add(GetFiles(item));
        }
    }
    

    最后,我为在活动解决方案中获取所有 ProjectItems 所做的递归

    ProjectItem GetFiles(ProjectItem item)
    {
        //base case
        if (item.ProjectItems == null)
            return item;
    
        var items = item.ProjectItems.GetEnumerator();
        while (items.MoveNext())
        {
            var currentItem = (ProjectItem)items.Current;
            projectItems.Add(GetFiles(currentItem));
        }
    
        return item;
    }
    

    【讨论】:

    • 这里的“CodeRush”是什么意思?
    • @macias,这里的“CodeRush”是对访问 DXCore 服务的主要对象的引用。 “CodeRush.ApplicationObject”属性返回 DXCore 加载项实例的 EnvDTE 对象。要了解更多信息,请点击此链接:bit.ly/hrweIk
    • 顺便说一句,要使用 DXCore API 获取解决方案/项目文件列表,请使用以下代码行:IEnumerable files = CodeRush.Source.ActiveSolution.AllFiles;
    • @AlexSkorkin 中的链接应该是 skorkin.com/2010/11/…(因为不是每个人都可以在工作中访问 bit.ly,:()
    • 这里的item枚举很幼稚。首先,它无法考虑嵌套的解决方案文件夹,以及直接位于解决方案文件夹下的文件(而不是通过项目)。
    【解决方案2】:

    这一切都可以在 Visual Studio SDK 中使用 DTE 轻松获得。

    您可以使用Projects 接口获取解决方案中的项目列表。

    您可以使用ProjectItem 接口获取项目中的项目列表。

    如需了解更多信息,我建议您阅读Controlling Projects and Solutions

    【讨论】:

    • -1,不,它不容易获得,这个答案只是快速谷歌搜索的结果。尽管项目接口提供了一个可枚举的 ProjectItems,但它只包含项目中的顶级项目。需要遍历项目文件夹并且只选择文件。多个文件名也可以用于使这进一步复杂化的项目。
    【解决方案3】:

    EnvDTE : Getting all projects (the SolutionFolder PITA)

    即使项目位于子文件夹中,此解决方案也能出色地获取解决方案中的所有项目。

    请务必阅读代码下方的 cmets,因为它指出了一个基本修复,请使用它来获取 DTE2 而不是原始代码,否则它无法获取正确的 Visual Studio 实例:

    DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as DTE2;
    

    (代码已更新以包含上述修复)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多