Как программно перечислить все проекты в решении? Я возьму вызов script, командной строки или API.
Как программно перечислить все проекты в решении?
Ответ 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 для фильтрации пакетов решений.