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

ale*_*rya 1 c# visual-studio visual-studio-extensions

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

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

foreach (Project project in projects)
//....
Run Code Online (Sandbox Code Playgroud)

除了一个小问题外,这种方法很好用,很整洁:项目变量实际上返回了确切的项目数。但是,如果项目的全名位于解决方案的文件夹中,则可能为EMPTY。(我的意思是当项目合并在解决方案的文件夹中时解决方案的结构)

如何正确地获得这些项目?

ale*_*rya 5

这是一个解决方案。此人至少是指环王:http : //www.wwwlicious.com/2011/03/29/envdte-getting-all-projects-html/


博客中的相关信息,以防万一(如Stack Overflow上的许多其他答案):

DTE2.Solution.Projects仅会为您提供解决方案下的顶级项目列表,因此将忽略嵌套在解决方案文件夹中的任何项目。为了获得这些讨厌的小蠕虫,您需要钻入可从Project上的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;
    }
}
Run Code Online (Sandbox Code Playgroud)