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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何以编程方式列出解决方案中的所有项目?相关的知识,希望对你有一定的参考价值。

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

答案

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

从Visual Studio 2013开始,Microsoft.Build.dll为SolutionFile对象提供了一些非常方便的功能。

下面是使用v14.0版本按照它们在解决方案中出现的顺序列出所有项目的相对路径的示例。

Add-Type -Path (${env:ProgramFiles(x86)} + 'Reference AssembliesMicrosoftMSBuildv14.0Microsoft.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过滤掉了解决方案文件夹。

另一答案
    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的评论修改正则表达式包括“。*”

另一答案

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

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

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

另一答案

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

Get-Project -All
另一答案

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

另一答案

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

另一答案

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

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

另一答案

诀窍是选择正确的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:NuGetApp1NuGetApp1.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 
Studio2017ProfessionalMSBuild15.0Binamd64Microsoft.Build.dll')

$slnPath = 'c:NuGetApp1NuGetApp1.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}
    }
}  
另一答案

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

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

以上是关于如何以编程方式列出解决方案中的所有项目?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式递归列出eclipse工作区中的所有文件

以编程方式:列出在实体框架模型中找到的所有存储过程

如何在android中以编程方式在片段之间导航?

如何以编程方式列出 C++ 或 Python 中的 DLL 依赖项?

如何以编程方式选择 WPF TreeView 中的项目?

以编程方式列出 Google Cloud Platform 项目中的 Oauth 2.0 客户端 ID