Como faço para listar programaticamente todos os projetos em uma solução?

Como faço para listar programaticamente todos os projetos em uma solução? Vou pegar um script, linha de comando ou chamadas de API.

Aqui está um script do PowerShell que recupera detalhes do projeto de um arquivo .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]); } 

Edit: Alterado o regex para include o ". *" De acordo com o comentário por Kumar Vaibhav

Você pode usar o object EnvDTE.Solution.Projects para acessar programaticamente os projetos em uma solução.

Uma pegadinha é que, se você tiver quaisquer SolutionFolders em sua solução, todos os projetos nessas pastas não serão mostrados na coleção acima.

Escrevi um artigo incluindo um exemplo de código sobre como obter todos os projetos, independentemente de quaisquer pastas de solução

Atualmente você pode usar o Console do Gerenciador de Pacotes no VS para obter essas informações. Use o comando Get-Project do powershell

 Get-Project -All 

Basta ler a lista do arquivo * .sln. Existem seções “Projeto” – “EndProject”.
Aqui está um artigo do MSDN.

Se você escrever seu programa como Visual Studio Add-in, poderá acessar o EnvDTE para descobrir todos os projetos dentro da solução atualmente aberta.

Há uma solução realmente elegante aqui: Analisando arquivos do Visual Studio Solution

A resposta de John Leidegren envolve envolver a class interna Microsoft.Build.Construction.SolutionParser .

Se você precisar fazer isso em uma máquina não Windows, poderá usar o seguinte comando Bash:

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

Desde o Visual Studio 2013, o Microsoft.Build.dll fornece um object SolutionFile com algumas funções muito úteis.

Veja um exemplo do uso da versão v14.0 para listar o caminho relativo de todos os projetos na ordem em que aparecem na solução.

 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 

Existem muitas outras propriedades no object do projeto (ProjectName, AbsolutePath, configurações, etc.) que podem ser úteis. No exemplo acima, usei o ProjectType para filtrar as Pastas de Soluções.

O truque é escolher o MsBuild.dll certo. Em VS2017 é realmente “C: \ Arquivos de programas (x 86) \ Microsoft Visual Studio \ 2017 \ Professional \ MSBuild \ 15.0 \ Bin \ amd64 \ Microsoft.Build.dll” (não use o ddr Msbuild padrão em referências. Navegue até este caminho)

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} } }