2013-09-30 14 views
6

Jak uzyskać nazwę wszystkich projektów w rozwiązaniu za pośrednictwem C#? Rozwiązanie ma projekty konsolowe, w których jest wiele usług Windows.Jak uzyskać nazwę wszystkich projektów w rozwiązaniu?

Moim celem jest znalezienie wszystkich nazw projektów, a następnie uzyskanie nazwy wszystkich usług systemu Windows w projektach.

Narzędzie zostanie wykonane w nowym projekcie w tym samym rozwiązaniu. Dzięki za podpowiedź.

Odpowiedz

6

Sprawdź to MSDN, które rozwiąże Twoje zapytanie.

Plik .sln zawiera informacje tekstowe środowisko używa do znaleźć i załadować parametrów nazwa-wartość dla utrwalonych danych i VSPackages projektu to referencje. Gdy użytkownik otwiera rozwiązanie, środowisko przechodzi przez informacje preSolution, Project i postSolution w pliku .sln w celu załadowania rozwiązania, projektów w ramach rozwiązania i wszelkich utrwalonych informacji dołączonych do rozwiązania.

Sprawdź również EnvDTE : Getting all projects.

również sprawdzić ten Thread (pełny kredyt John Leidegren za takie miłe odpowiedzi)

public class Solution 
{ 
    //internal class SolutionParser 
    //Name: Microsoft.Build.Construction.SolutionParser 
    //Assembly: Microsoft.Build, Version=4.0.0.0 

    static readonly Type s_SolutionParser; 
    static readonly PropertyInfo s_SolutionParser_solutionReader; 
    static readonly MethodInfo s_SolutionParser_parseSolution; 
    static readonly PropertyInfo s_SolutionParser_projects; 

    static Solution() 
    { 
     s_SolutionParser = Type.GetType("Microsoft.Build.Construction.SolutionParser, Microsoft.Build, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", false, false); 
     if (s_SolutionParser != null) 
     { 
      s_SolutionParser_solutionReader = s_SolutionParser.GetProperty("SolutionReader", BindingFlags.NonPublic | BindingFlags.Instance); 
      s_SolutionParser_projects = s_SolutionParser.GetProperty("Projects", BindingFlags.NonPublic | BindingFlags.Instance); 
      s_SolutionParser_parseSolution = s_SolutionParser.GetMethod("ParseSolution", BindingFlags.NonPublic | BindingFlags.Instance); 
     } 
    } 

    public List<SolutionProject> Projects { get; private set; } 

    public Solution(string solutionFileName) 
    { 
     if (s_SolutionParser == null) 
     { 
      throw new InvalidOperationException("Can not find type 'Microsoft.Build.Construction.SolutionParser' are you missing a assembly reference to 'Microsoft.Build.dll'?"); 
     } 
     var solutionParser = s_SolutionParser.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic).First().Invoke(null); 
     using (var streamReader = new StreamReader(solutionFileName)) 
     { 
      s_SolutionParser_solutionReader.SetValue(solutionParser, streamReader, null); 
      s_SolutionParser_parseSolution.Invoke(solutionParser, null); 
     } 
     var projects = new List<SolutionProject>(); 
     var array = (Array)s_SolutionParser_projects.GetValue(solutionParser, null); 
     for (int i = 0; i < array.Length; i++) 
     { 
      projects.Add(new SolutionProject(array.GetValue(i))); 
     } 
     this.Projects = projects; 
    } 
} 

[DebuggerDisplay("{ProjectName}, {RelativePath}, {ProjectGuid}")] 
public class SolutionProject 
{ 
    static readonly Type s_ProjectInSolution; 
    static readonly PropertyInfo s_ProjectInSolution_ProjectName; 
    static readonly PropertyInfo s_ProjectInSolution_RelativePath; 
    static readonly PropertyInfo s_ProjectInSolution_ProjectGuid; 

    static SolutionProject() 
    { 
     s_ProjectInSolution = Type.GetType("Microsoft.Build.Construction.ProjectInSolution, Microsoft.Build, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", false, false); 
     if (s_ProjectInSolution != null) 
     { 
      s_ProjectInSolution_ProjectName = s_ProjectInSolution.GetProperty("ProjectName", BindingFlags.NonPublic | BindingFlags.Instance); 
      s_ProjectInSolution_RelativePath = s_ProjectInSolution.GetProperty("RelativePath", BindingFlags.NonPublic | BindingFlags.Instance); 
      s_ProjectInSolution_ProjectGuid = s_ProjectInSolution.GetProperty("ProjectGuid", BindingFlags.NonPublic | BindingFlags.Instance); 
     } 
    } 

    public string ProjectName { get; private set; } 
    public string RelativePath { get; private set; } 
    public string ProjectGuid { get; private set; } 

    public SolutionProject(object solutionProject) 
    { 
     this.ProjectName = s_ProjectInSolution_ProjectName.GetValue(solutionProject, null) as string; 
     this.RelativePath = s_ProjectInSolution_RelativePath.GetValue(solutionProject, null) as string; 
     this.ProjectGuid = s_ProjectInSolution_ProjectGuid.GetValue(solutionProject, null) as string; 
    } 
} 
+0

Aby użyć rozwiązanie wątku , Muszę użyć Microsoft.VisualStudio.Shell.Interop. Nie mogę go znaleźć w Visual Studio 2012. –

+0

Jest tam w Visual Studio 2012. Sprawdź to: - http://msdn.microsoft.com/en-us/library/bb164686.aspx –

+0

Dlaczego repost [inna odpowiedź StackOverflow ] (http://stackoverflow.com/a/4634505/1810243) we własnej odpowiedzi ... nawet jeśli dajesz kredyt. – MikeSmithDev

1

To będzie łatwiejsze za pomocą nowego Roslyn API

var workspace=MSBuildWorkspace.Create(); 
var solution = workspace.OpenSolutionAsync(solutionPath).Result; 
var projects = solution.Projects; 
foreach(var project in projects) 
{ 
    //TODO    
} 
Powiązane problemy