Как программно перечислить все проекты в решении? - PullRequest
40 голосов
/ 27 сентября 2010

Как мне программно перечислить все проекты в решении? Я возьму сценарий, командную строку или вызовы API.

Ответы [ 10 ]

50 голосов
/ 27 сентября 2010

Вот скрипт PowerShell, который извлекает детали проекта из файла .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]
      }
    }
16 голосов
/ 08 февраля 2013
    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]);
    }

Редактировать: в регулярное выражение добавлено ". *" Согласно комментарию Кумара Вайбхава

10 голосов
/ 02 апреля 2011

Вы можете использовать объект EnvDTE.Solution.Projects, чтобы программно получить доступ к проектам в решении.

Однако есть один момент, который заключается в том, что если у вас есть SolutionFolders в вашем решении, любые проекты в этих папкахне показано в коллекции выше.

Я написал статью, включающую пример кода о том, как получить все проекты независимо от папок решения

6 голосов
/ 12 декабря 2015

В настоящее время вы можете использовать Консоль диспетчера пакетов в VS для получения этой информации.Используйте команду powershell Get-Project

Get-Project -All
4 голосов
/ 27 сентября 2010

просто прочитайте список из файла * .sln. Есть разделы «Проект» - «Конечный проект».
Вот статья из MSDN.

3 голосов
/ 01 апреля 2018

Хитрость в том, чтобы правильно выбрать MsBuild.dll. Под VS2017 это действительно "C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Professional \ MSBuild \ 15.0 \ Bin \ amd64 \ Microsoft.Build.dll" (Не используйте стандартный dsl Msbuild в ссылках. Перейдите по этому пути)

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}
    }
}  
3 голосов
/ 28 февраля 2013

Здесь действительно элегантное решение: Анализ файлов решения Visual Studio

Ответ Джона Лейдгрена включает в себя обёртывание внутреннего Microsoft.Build.Construction.SolutionParser класса.

3 голосов
/ 27 сентября 2010

Если вы пишете свою программу как надстройку Visual Studio, вы можете получить доступ к EnvDTE, чтобы узнать все проекты в рамках текущего открытого решения.

1 голос
/ 07 декабря 2016

Начиная с Visual Studio 2013, Microsoft.Build.dll предоставляет объект SolutionFile с некоторыми очень удобными функциями.

Вот пример использования версии v14.0 для перечисления относительного пути всех проектов в порядке их появления в решении.

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

Существует множество других свойств объекта проекта (ProjectName, AbsolutePath, конфигурации и т. Д.), Которые могут быть полезны. В приведенном выше примере я использовал ProjectType для фильтрации папок решений.

1 голос
/ 25 июня 2016

Если вам нужно сделать это на компьютере, отличном от Windows, вы можете использовать следующую команду Bash:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...