web-dev-qa-db-ja.com

ソリューション内のすべてのプロジェクトをプログラムで一覧表示するにはどうすればよいですか?

ソリューション内のすべてのプロジェクトをプログラムで一覧表示するにはどうすればよいですか?スクリプト、コマンドライン、またはAPI呼び出しを実行します。

44
Kiquenet

次に、.slnファイルからプロジェクトの詳細を取得するPowerShellスクリプトを示します。

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

編集:Kumar Vaibhavのコメントに従って、「。*」を含むように正規表現を修正しました

17
watbywbarif

EnvDTE.Solution.Projectsオブジェクトを使用して、ソリューション内のプロジェクトにプログラムでアクセスできます。

ただし、問題の1つは、ソリューションにSolutionFolderがある場合、これらのフォルダー内のプロジェクトは上記のコレクションに表示されないことです。

どのようにソリューションフォルダーに関係なく すべてのプロジェクトを取得する のコードサンプルを含む記事を書きました

11
Scott Mackay

トリックは、正しいMsBuild.dllを選択することです。 VS2017では、実際には「C:\ Program Files(x86)\ Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\AMD64\Microsoft.Build.dll」です(参照で標準のMsbuild ddlを使用しないでください。これを参照してください)道)

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

パワーシェル:

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

現在、VSで Package Manager Console を使用してその情報を取得できます。 PowerShellを使用するGet-Projectコマンド

Get-Project -All
7
cezarypiatek

* .slnファイルからリストを読み取るだけです。 「プロジェクト」-「EndProject」セクションがあります。
これが MSDNの記事です

4
default locale

ここには本当にエレガントなソリューションがあります: Visual Studioソリューションファイルの解析

John Leidegrenの答えは、内部Microsoft.Build.Construction.SolutionParserクラス。

3
Dylan Berry

プログラムをVisual Studioアドインとして作成する場合、 EnvDTE にアクセスして、現在開いているソリューション内のすべてのプロジェクトを見つけることができます。

3
Oliver

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
Adam Hardy

Windows以外のマシンでこれを行う必要がある場合は、次のBashコマンドを使用できます。

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

1
Casey

これはおそらくすでに回答済みの質問であることはわかっていますが、slnファイルを読み取る私のアプローチを共有したいと思います。また、実行時にプロジェクトがテストプロジェクトかどうかを決定しています

function ReadSolutionFile($solutionName)
{
    $startTime = (Get-Date).Millisecond
    Write-Host "---------------Read Start---------------" 
    $solutionProjects = @()

    dotnet  sln "$solutionName.sln" list | ForEach-Object{     
        if($_  -Match ".csproj" )
        {
            #$projData = ($projectString -split '\\')

            $proj = New-Object PSObject -Property @{

                Project = [string]$_;
                IsTestProject =   If ([string]$_ -Match "test") {$True} Else {$False}  
            }

            $solutionProjects += $proj

        }
    }

    Write-Host "---------------Read finish---------------" 
    $solutionProjects

    $finishTime = (Get-Date).Millisecond
    Write-Host "Script run time: $($finishTime-$startTime) mil" 
}

これがお役に立てば幸いです。

0