Wie listet ich programmgesteuert alle Projekte in einer Lösung auf? Ich nehme ein Skript, eine Befehlszeile oder API-Aufrufe.Wie programmiere ich programmatisch alle Projekte in einer Lösung?
Antwort
nur die Liste aus * .sln Datei lesen. Es gibt Abschnitte "Project" - "EndProject".
Hier ist an article from MSDN.
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.
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]
}
}
Ich weiß, das ist alt, aber es ist schön. Hat mir eine Menge Zeit erspart. – ncooper09
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
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
How kann dies außerhalb eines VS-Pakets geschehen? – Kurren
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
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 –
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
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); –
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.
Derzeit können Sie Package Manger Console in VS verwenden, um diese Informationen zu erhalten. Verwenden Sie Powershell Get-Befehl Projekt
Get-Project -All
Welche ** Visual Studio ** _ ** 'Version' ** _? – Kiquenet
Ich verwende VS2013 – cezarypiatek
'Get-Project -All | Install-Package-Nlog': cool: – guneysus
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
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.
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
@Kiquenet Ich fürchte, ich habe Ihren Kommentar nicht verstanden –
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