Hoe kan ik programmatisch alle projecten in een oplossing weergeven?

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.

Other episodes