2010-09-27 3 views

Antwort

4

nur die Liste aus * .sln Datei lesen. Es gibt Abschnitte "Project" - "EndProject".
Hier ist an article from MSDN.

+0

@Kiquenet Ich fürchte, ich habe Ihren Kommentar nicht verstanden –

+0

nicht alle ** Parser C# -Klasse ** zum Lesen _sln files_? Ähnlich wie *** http: //stackoverflow.com/questions/707107/parsing-visual-studio-solution-files** ** http: //stackoverflow.com/questions/1243022/parsing-tnsnames-ora-in -visual-c-sharp-2008 ** – Kiquenet

3

Wenn Sie Ihr Programm als Visual Studio-Add-In schreiben Sie die EnvDTE zugreifen können alle Projekte innerhalb der aktuell geöffneten Lösung zu finden.

38

Hier ist ein Powershell-Skript, das Projektdetails aus einer SLN-Datei ruft:

Get-Content 'Foo.sln' | 
    Select-String 'Project\(' | 
    ForEach-Object { 
     $projectParts = $_ -Split '[,=]' | ForEach-Object { $_.Trim('[ "{}]') }; 
     New-Object PSObject -Property @{ 
     Name = $projectParts[1]; 
     File = $projectParts[2]; 
     Guid = $projectParts[3] 
     } 
    } 
+1

Ich weiß, das ist alt, aber es ist schön. Hat mir eine Menge Zeit erspart. – ncooper09

+0

Wenn Sie möchten, können Sie Lösungsmappen herausfiltern, indem Sie zwischen den Zeilen 2 und 3 einen zusätzlichen Select-String hinzufügen: 'Select-String" {2150E333-8FDC-42A3-9474-1A3956D46DE8} "-NotMatch |' – alastairs

9

Sie die EnvDTE.Solution.Projects Objekt programmatisch verwenden können, um Zugriff auf die Projekte in einer Lösung zu erhalten.

Ein Problem ist, dass alle Projekte in diesen Ordnern in der obigen Auflistung nicht angezeigt werden, wenn Sie SolutionFolder in Ihrer Projektmappe haben.

Ich habe einen Artikel mit einem Codebeispiel auf, wie to get all projects unabhängig von irgendwelchen solutionfolders

+0

How kann dies außerhalb eines VS-Pakets geschehen? – Kurren

+1

Dies kann nur in einer VS-Erweiterung verwendet werden, daher ist es für jeden nutzlos, der ein eigenständiges Tool zum Lesen von Quellprojekten in einer Lösung verwenden möchte. – Alex

+0

Sie können eine Referenz auf eine [laufende Instanz von VS] erhalten (https://github.com/wwwlicious/VSAutomate/blob/master/VSAutomate/Ide.cs#L25) oder Sie können auf '$ dte' aus dem Paket zugreifen Managerkonsole. Wenn Sie VS überhaupt nicht laufen haben, brauchen Sie eine alternative Lösung. Die neuen MSBuild-Pakete enthalten jetzt Klassen zum Analysieren von Projekt- und Projektdateien, aber diese sind immer noch vor RTM –

16
var Content = File.ReadAllText(SlnPath); 
    Regex projReg = new Regex(
     "Project\\(\"\\{[\\w-]*\\}\"\\) = \"([\\w _]*.*)\", \"(.*\\.(cs|vcx|vb)proj)\"" 
     , RegexOptions.Compiled); 
    var matches = projReg.Matches(Content).Cast<Match>(); 
    var Projects = matches.Select(x => x.Groups[2].Value).ToList(); 
    for (int i = 0; i < Projects.Count; ++i) 
    { 
     if (!Path.IsPathRooted(Projects[i])) 
      Projects[i] = Path.Combine(Path.GetDirectoryName(SlnPath), 
       Projects[i]); 
     Projects[i] = Path.GetFullPath(Projects[i]); 
    } 

bearbeiten geschrieben: Geändertes die Regex die enthalten gemäß dem Kommentar von Kumar Vaibhav

+4

Das obige funktioniert aber es gibt ein kleines Problem. Wenn Ihre Projekte wie "AB.CD" heißen - ich meine wenn das "." Ist da, dann würde die Regex diese nicht erkennen. Die folgende kleine Änderung würde es funktionieren lassen - Regex projReg = new Regex ( "Projekt \\ (\" \ [\\ w -] * \\} \ "\\) = \" ([\\ w _ ] *. *) \ ", \" (. * \\. (cs | vcx | vb) proj) \ "" , RegexOptions.Compiled); –

3
„*.“

Hier gibt es eine wirklich elegante Lösung: Parsing Visual Studio Solution files

Die Antwort von John Leidegren bezieht sich auf die interne Microsoft.Build.Construction.SolutionParser Klasse.

6

Derzeit können Sie Package Manger Console in VS verwenden, um diese Informationen zu erhalten. Verwenden Sie Powershell Get-Befehl Projekt

Get-Project -All 
+0

Welche ** Visual Studio ** _ ** 'Version' ** _? – Kiquenet

+0

Ich verwende VS2013 – cezarypiatek

+1

'Get-Project -All | Install-Package-Nlog': cool: – guneysus

1

Wenn Sie dies auf einer Nicht-Windows-Maschine tun müssen, können Sie den folgenden Bash-Befehl verwenden:

grep "Project(" NameOfYourSolution.sln | cut -d'"' -f4

1

Seit Visual Studio 2013 die Microsoft.Build .dll stellt ein SolutionFile-Objekt mit einigen sehr praktischen Funktionen bereit.

Hier ist ein Beispiel für die Verwendung der Version v14.0, um den relativen Pfad aller Projekte in der Reihenfolge aufzulisten, in der sie in der Lösung angezeigt werden.

Add-Type -Path (${env:ProgramFiles(x86)} + '\Reference Assemblies\Microsoft\MSBuild\v14.0\Microsoft.Build.dll') 
$solutionFile = '<FULL PATH TO SOLUTION FILE>' 
$solution = [Microsoft.Build.Construction.SolutionFile] $solutionFile 
($solution.ProjectsInOrder | Where-Object {$_.ProjectType -eq 'KnownToBeMSBuildFormat'}).RelativePath 

Es gibt viele andere Eigenschaften auf dem Projektobjekt (Projektname, AbsolutePath, Konfigurationen etc.), die von Nutzen sein kann. Im obigen Beispiel habe ich den ProjectType verwendet, um Lösungsordner herauszufiltern.

+0

Für VS2017 ist es unter VS2017 '' '' "C: \ Programme (x86) \ Microsoft Visual Studio \ 2017 \ Professional \ MSBuild \ 15.0 \ Bin \ AMD64 \ Microsoft.Build.dll "' '' ' Und ärgerlich, aber für sqlprojs Dateien, Projekttyp ist Unbekannt' '' [SolutionProjectType] :: Unknown''' – Curios