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。(我指的是解决方案的结构,当项目统一在解决方案的文件夹中)
如何正确获得这些项目?
这是一个解决方案。这家伙至少是指环王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;
}
}