如何以编程方式列出解决方案中的所有项目?

Kiq*_*net 43 c# scripting projects-and-solutions visual-studio-2008

如何以编程方式列出解决方案中的所有项目?我将采用脚本,命令行或API调用.

bri*_*ris 52

这是一个PowerShell脚本,用于从.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]
      }
    }
Run Code Online (Sandbox Code Playgroud)

  • 我知道这很古老,但很漂亮.救了我一大堆时间. (2认同)
  • 如果需要,可以通过在第2行和第3行之间添加附加的Select-String来过滤解决方案文件夹,如下所示:`Select-String“ {2150E333-8FDC-42A3-9474-1A3956D46DE8}” -NotMatch |` (2认同)

wat*_*rif 17

    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]);
    }
Run Code Online (Sandbox Code Playgroud)

编辑:根据Kumar Vaibhav的评论修改正则表达式包括".*"

  • 以上工作但有一点问题.如果你的项目被命名为"AB.CD" - 我的意思是'.' 那么正则表达式不会识别那些.以下小改动将使其工作 - Regex projReg = new Regex("Project \\(\"\\ {[\\ w - ]*\\} \"\\)= \"([\\ w _]*.*)\",\"(.*\\.(cs | vcx | vb)proj)\"",RegexOptions.Compiled); (5认同)

Sco*_*kay 10

您可以使用EnvDTE.Solution.Projects对象以编程方式访问解决方案中的项目.

但问题是,如果您的解决方案中有任何SolutionFolders,则上述集合中不会显示这些文件夹中的任何项目.

我写了一篇文章,其中包括如何获取所有项目的代码示例,无论任何解决方案文件夹

  • 这只能在VS扩展中使用,因此对于想要独立工具来读取解决方案中的源项目的任何人来说都没用. (3认同)

Rol*_*oos 7

诀窍是选择正确的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;
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

电源外壳:

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}
    }
}  
Run Code Online (Sandbox Code Playgroud)


小智 7

从 powershelll 并在解决方案的文件夹中写入

dotnet sln 列表


cez*_*tek 6

目前,您可以使用VS中的程序包管理器控制台来获取该信息.使用powershell Get-Project命令

Get-Project -All
Run Code Online (Sandbox Code Playgroud)


def*_*ale 5

只需从 *.sln 文件中读取列表。有“项目”-“结束项目”部分。
这是MSDN的一篇文章。