Come elenco programmaticamente tutti i progetti in una soluzione?

Come elenco programmaticamente tutti i progetti in una soluzione? Prenderò uno script, una riga di comando o chiamate API.

Ecco uno script PowerShell che recupera i dettagli del progetto da un file .sln:

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] } } 
  var Content = File.ReadAllText(SlnPath); Regex projReg = new Regex( "Project\\(\"\\{[\\w-]*\\}\"\\) = \"([\\w _]*.*)\", \"(.*\\.(cs|vcx|vb)proj)\"" , RegexOptions.Compiled); var matches = projReg.Matches(Content).Cast(); 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]); } 

Modifica: modificato la regex per includere ". *" Come da commento di Kumar Vaibhav

È ansible utilizzare l’object EnvDTE.Solution.Projects per accedere a livello di programmazione ai progetti in una soluzione.

Un trucco è che se si dispone di SolutionFolders nella soluzione, i progetti in queste cartelle non vengono visualizzati nella raccolta sopra.

Ho scritto un articolo che include un esempio di codice su come ottenere tutti i progetti indipendentemente da eventuali cartelle di soluzione

Attualmente è ansible utilizzare Package Manger Console in VS per ottenere tali informazioni. Usa il comando Get-Project di powershell

 Get-Project -All 

basta leggere l’elenco dal file * .sln. Esistono sezioni “Progetto” – “EndProject”.
Ecco un articolo da MSDN.

Se scrivi il tuo programma come componente aggiuntivo di Visual Studio, puoi accedere a EnvDTE per scoprire tutti i progetti all’interno della soluzione attualmente aperta.

C’è una soluzione davvero elegante qui: analizzare i file di soluzione di Visual Studio

La risposta di John Leidegren riguarda il wrapping della class interna Microsoft.Build.Construction.SolutionParser .

Se è necessario eseguire questa operazione su un computer non Windows, è ansible utilizzare il seguente comando Bash:

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

Dal momento che Visual Studio 2013 Microsoft.Build.dll fornisce un object SolutionFile con alcune funzioni molto utili.

Ecco un esempio di utilizzo della versione v14.0 per elencare il percorso relativo di tutti i progetti nell’ordine in cui appaiono nella soluzione.

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

Ci sono molte altre proprietà sull’object di progetto (ProjectName, AbsolutePath, configurazioni ecc.) Che possono essere utili. Nell’esempio precedente ho utilizzato ProjectType per filtrare le cartelle delle soluzioni.

Il trucco è scegliere il giusto MsBuild.dll. Sotto VS2017 è infatti “C: \ Programmi (x86) \ Microsoft Visual Studio \ 2017 \ Professional \ MSBuild \ 15.0 \ Bin \ amd64 \ Microsoft.Build.dll” (Non usare il ddl standard di Msbuild nei riferimenti. sentiero)

C #:

 var solutionFile = SolutionFile.Parse(@"c:\NuGetApp1\NuGetApp1.sln");//your solution full path name var projectsInSolution = solutionFile.ProjectsInOrder; foreach(var project in projectsInSolution) { switch (project.ProjectType) { case SolutionProjectType.KnownToBeMSBuildFormat: { break; } case SolutionProjectType.SolutionFolder: { break; } } } 

PowerShell:

 Add-Type -Path (${env:ProgramFiles(x86)} + '\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\amd64\Microsoft.Build.dll') $slnPath = 'c:\NuGetApp1\NuGetApp1.sln' $slnFile = [Microsoft.Build.Construction.SolutionFile]::Parse($slnPath) $pjcts = $slnFile.ProjectsInOrder foreach ($item in $pjcts) { switch($item.ProjectType) { 'KnownToBeMSBuildFormat'{Write-Host Project : $item.ProjectName} 'SolutionFolder'{Write-Host Solution Folder : $item.ProjectName} } }