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