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

问题描述 投票:36回答:10

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

c# visual-studio-2008 scripting projects-and-solutions
10个回答
49
投票

这是一个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]
      }
    }

1
投票

从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过滤掉了解决方案文件夹。


16
投票
    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的评论修改正则表达式包括“。*”


10
投票

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

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

我写了一篇文章,其中包括to get all projects的代码示例,无论是否有任何解决方案文件夹


6
投票

目前,您可以在VS中使用Package Manager Console来获取该信息。使用powershell Get-Project命令

Get-Project -All

4
投票

只需从* .sln文件中读取列表。有“项目” - “EndProject”部分。 这是an article from MSDN.


3
投票

如果您将程序编写为Visual Studio加载项,则可以访问EnvDTE以查找当前打开的解决方案中的所有项目。


3
投票

这里有一个非常优雅的解决方案:Parsing Visual Studio Solution files

John Leidegren的答案涉及包装内部Microsoft.Build.Construction.SolutionParser类。


3
投票

诀窍是选择正确的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}
    }
}  

1
投票

如果需要在非Windows计算机上执行此操作,可以使用以下Bash命令:

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

© www.soinside.com 2019 - 2024. All rights reserved.