获取VS Add-in或DXCore插件的解决方案/项目文件列表

时间:2009-09-16 18:33:42

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

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

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

总而言之:如何通过Visual Studio SDK DXCore,如何在解决方案及其项目中获得可靠的文件列表?

3 个答案:

答案 0 :(得分:18)

谢谢,里德;你链接的文章让我足够远,可以在几分钟内得到一个概念证明。

因为我认为它是相关的,所以这里是我收集ProjectItems的迭代和递归方法。我在DXCore中做到了这一点,但同样的想法适用于原始的Visual Studio SDK(DXCore只是一个比SDK更好看的包装器)。 “解决方案”,“项目”,“项目”和“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));
    }
}

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

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;
}

答案 1 :(得分:5)

在Visual Studio SDK中使用DTE可以轻松实现这一切。

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

您可以使用ProjectItem界面获取项目中的项目列表。

有关详细信息,我建议您阅读Controlling Projects and Solutions

答案 2 :(得分:1)

请参阅EnvDTE : Getting all projects (the SolutionFolder PITA)

即使项目位于子文件夹中,此解决方案也可以很好地获得解决方案中的所有项目。

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

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

(代码已更新,包含以上修复程序)