Visual Studio解决方案中的项目名称有时为空

wwtsj6pe  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(245)

在Visual Studio扩展中,我想获取所有项目及其名称:

var service = (DTE) Package.GetGlobalService(typeof (SDTE));
var projects = service.Solution.Projects;

foreach (Project project in projects)
//....

这种方法工作得很好,但有一个小问题:project变量返回项目的确切数量。但是如果项目位于解决方案的文件夹中,则项目的全名可能为EMPTY。(我的意思是当项目在解决方案的文件夹中合并时的解决方案的结构)
如何正确获得这些项目?

omqzjyyz

omqzjyyz1#

这里有一个解决方案。这家伙至少是指环王:http://www.wwwlicious.com/2011/03/29/envdte-getting-all-projects-html/
来自博客的相关信息,以防它消失(就像Stack Overflow上的许多其他答案一样):
DTE2.Solution.Projects将只为您提供解决方案下的顶级项列表,因此会遗漏嵌套在解决方案文件夹中的任何项目。为了找到这些讨厌的小蠕虫,您需要深入研究从项目上的ProjectItems集合访问的ProjectItem.SubProject属性。为了解决所有问题,如果您有嵌套的解决方案文件夹,则需要进行一些递归。

using System.Collections.Generic;  
using EnvDTE;  
using EnvDTE80;

public static class SolutionProjects  
{
    public static DTE2 GetActiveIDE()
    {
        // Get an instance of currently running Visual Studio IDE.
        DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as DTE2;
        return dte2;
    }

    public static IList<Project> Projects()
    {
        Projects projects = GetActiveIDE().Solution.Projects;
        List<Project> list = new List<Project>();
        var item = projects.GetEnumerator();
        while (item.MoveNext())
        {
            var project = item.Current as Project;
            if (project == null)
            {
                continue;
            }

            if (project.Kind == ProjectKinds.vsProjectKindSolutionFolder)
            {
                list.AddRange(GetSolutionFolderProjects(project));
            }
            else
            {
                list.Add(project);
            }
        }

        return list;
    }

    private static IEnumerable<Project> GetSolutionFolderProjects(Project solutionFolder)
    {
        List<Project> list = new List<Project>();
        for (var i = 1; i <= solutionFolder.ProjectItems.Count; i++)
        {
            var subProject = solutionFolder.ProjectItems.Item(i).SubProject;
            if (subProject == null)
            {
                continue;
            }

            // If this is another solution folder, do a recursive call, otherwise add
            if (subProject.Kind == ProjectKinds.vsProjectKindSolutionFolder)
            {
               list.AddRange(GetSolutionFolderProjects(subProject));
            }
           else
           {
               list.Add(subProject);
           }
        }
        return list;
    }
}

相关问题