Visual Studio Solution中的项目名称有时为空

本文关键字:项目 Studio Solution Visual | 更新日期: 2023-09-27 18:18:13

在visual studio扩展我想得到所有的项目和他们的名字:

var service = (DTE) Package.GetGlobalService(typeof (SDTE));
var projects = service.Solution.Projects;
foreach (Project project in projects)
//....

除了一个小问题,这种方法工作得很好,很简洁:项目变量返回项目的确切数量。但是,如果项目位于解决方案的文件夹中,则项目的全名可能为EMPTY。(我指的是解决方案的结构,当项目统一在解决方案的文件夹中)

如何正确获得这些项目?

Visual Studio Solution中的项目名称有时为空

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


来自博客的相关信息,以防它消失(就像Stack Overflow上的许多其他答案一样):

DTE2.Solution。项目将仅为您提供解决方案下的顶级项目列表,因此将错过嵌套在解决方案文件夹中的任何项目。为了得到这些讨厌的小虫子,你需要钻到投射物里。从项目上的projtems集合访问的子项目属性。最后,如果你有嵌套的解决方案文件夹,那么你需要一些递归。

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