14

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

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

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

4

3 回答 3

18

谢谢,里德;您链接的文章让我足够深入,可以在几分钟内完成概念验证。

因为我觉得它是相关的,所以这里是我收集 ProjectItems 的迭代和递归方式。我在 DXCore 中这样做了,但同样的想法也适用于原始的 Visual Studio SDK(DXCore 只是 SDK 的一个更好看的包装器)。“解决方案”、“项目”、“项目”和“项目项目”对象就在 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;
}
于 2009-09-16T21:57:54.130 回答
4

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

您可以使用“项目”界面获取解决方案中的项目列表。

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

有关更多信息,我建议阅读控制项目和解决方案

于 2009-09-16T18:39:30.827 回答
1

请参阅EnvDTE:获取所有项目(SolutionFolder PITA)

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

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

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

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

于 2013-11-06T12:03:56.837 回答