Recently during a software factory development I had a problem, how can I get all projects that exists in a visual studio solution.
The only solution that I found was this:
public static Project[] GetAllSolutionProjects(Solution solution)
{
if (solution == null)
{
return null;
}
List<Project> solutionProjects = new List<Project>();
foreach (Project project in solution.Projects)
{
if (project.Object is Project)
{
solutionProjects.Add(project.Object as Project);
}
else
{
Project[] projects = GetAllVsProjects(project.ProjectItems);
if (projects != null && projects.Length > 0)
{
solutionProjects.AddRange(projects);
}
}
}
return solutionProjects.ToArray();
}
private static Project[] GetAllVsProjects(ProjectItems items)
{
if (items == null)
{
return null;
}
List<Project> solutionProjects = new List<Project>();
foreach (ProjectItem item in items)
{
if (IsProject(item.Kind))
{
solutionProjects.Add(item.Object as Project);
}
else if (item.SubProject != null)
{
if (IsProject(item.SubProject.Kind))
{
solutionProjects.Add(item.SubProject as Project);
}
else
{
Project[] subprojects = GetAllVsProjects(item.SubProject.ProjectItems);
if (subprojects != null && subprojects.Length > 0)
{
solutionProjects.AddRange(subprojects);
}
}
}
else
{
Project[] projects = GetAllVsProjects(item.ProjectItems);
if (projects != null && projects.Length > 0)
{
solutionProjects.AddRange(projects);
}
}
}
return solutionProjects.ToArray();
}
public static bool IsProject(Guid projectKind)
{
//Visual Basic {F184B08F-C81C-45F6-A57F-5ABD9991F28F}
//Visual C# {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
//Visual C++ {8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}
//Visual J# {E6FDF86B-F3D1-11D4-8576-0002A516ECE8}
//Web Project {E24C65DC-7377-472b-9ABA-BC803B73C61A}
return IsWebProject(projectKind) ||
IsVisualJSharpProject(projectKind) ||
IsVisualCPlusPlusProject(projectKind) ||
IsVisualCSharpProject(projectKind) ||
IsVisualBasicProject(projectKind);
}
public static bool IsProject(string projectKind)
{
if(string.IsNullOrEmpty(projectKind))
{
return false;
}
return IsProject(new Guid(projectKind));
}
public static bool IsWebProject(Guid projectKind)
{
return projectKind.CompareTo(new Guid("{E24C65DC-7377-472b-9ABA-BC803B73C61A}")) == 0;
}
public static bool IsVisualJSharpProject(Guid projectKind)
{
return projectKind.CompareTo(new Guid("{E6FDF86B-F3D1-11D4-8576-0002A516ECE8}")) == 0;
}
public static bool IsVisualCPlusPlusProject(Guid projectKind)
{
return projectKind.CompareTo(new Guid("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}")) == 0;
}
public static bool IsVisualCSharpProject(Guid projectKind)
{
return projectKind.CompareTo(new Guid("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}")) == 0;
}
public static bool IsVisualBasicProject(Guid projectKind)
{
return projectKind.CompareTo(new Guid("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}")) == 0;
}
Can any one tell me if is there a simple solution to get all projects in a VS solution, because this seems to me too much code just to get all projects. Is there another way???
The projects I want are: Visual Basic, Visual C#, Visual C++, Visual J# and Web Project. I was only able to do this watching to the project kind property.
Is there another way???