Hoe kan ik alle projecten in een oplossing programmatisch weergeven? Ik neem een script, opdrachtregel of API-aanroepen.
Antwoord 1, autoriteit 100%
Hier is een PowerShell-script dat projectdetails ophaalt uit een .sln-bestand:
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]
}
}
Antwoord 2, autoriteit 29%
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]);
}
Bewerken: de regex gewijzigd om de “.*” op te nemen volgens de opmerking van Kumar Vaibhav
Antwoord 3, autoriteit 18%
U kunt het EnvDTE.Solution.Projects-object gebruiken om programmatisch toegang te krijgen tot de projecten in een oplossing.
Eén probleem is echter dat als je SolutionFolders in je oplossing hebt, alle projecten in deze mappen niet worden weergegeven in de bovenstaande verzameling.
Ik heb een artikel geschreven met een codevoorbeeld over hoe alle projecten te krijgen ongeacht oplossingsmappen
Antwoord 4, autoriteit 14%
Momenteel kunt u Pakketbeheerconsolein VS gebruiken om die informatie te verkrijgen . Gebruik powershell Get-Project
-opdracht
Get-Project -All
Antwoord 5, autoriteit 12%
De truc is om de juiste MsBuild.dll te kiezen.
Onder VS2017 is het inderdaad “C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\amd64\Microsoft.Build.dll”
(Gebruik niet de standaard Msbuild ddl in referenties. Blader naar dit pad)
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}
}
}
Antwoord 6, autoriteit 8%
lees de lijst uit het *.sln-bestand. Er zijn secties “Project”-“EndProject”.
Hier is een artikel van MSDN.