Подтвердить что ты не робот

Как программно перечислить все проекты в решении?

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

4b9b3361

Ответ 1

Здесь PowerShell script, который извлекает детали проекта из .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]
      }
    }

Ответ 2

    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]);
    }

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

Ответ 3

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

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

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

Ответ 4

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

Get-Project -All

Ответ 5

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

С#:

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

Ответ 6

просто прочитайте список из *.sln файла. Существуют разделы "Проект" - "Конечный проект".
статья из MSDN.

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

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

Ответ 10

Так как 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 для фильтрации пакетов решений.