2010-09-27 88 views

回答

4

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

+0

@Kiquenet恐怕我不明白你的意见 – 2015-10-02 10:56:32

+0

没有任何**解析器C#类**阅读_sln files_?类似像*** http://stackoverflow.com/questions/707107/parsing-visual-studio-solution-files*** ** http://stackoverflow.com/questions/1243022/parsing-tnsnames-ora-in -visual-c-sharp-2008 ** – Kiquenet 2015-10-02 15:05:43

3

如果你写你的程序的Visual Studio插件,你可以访问EnvDTE找出当前打开的解决方案中的所有项目。

38

这里有一个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

我知道这是旧的,但它很漂亮。为我节省了一堆时间。 – ncooper09 2017-03-20 15:14:28

+0

如果需要,您可以通过在第2行和第3行之间添加附加的选择字符串来过滤掉解决方案文件夹,如下所示:'Select-String“{2150E333-8FDC-42A3-9474-1A3956D46DE8}”-NotMatch |' – alastairs 2017-04-26 21:52:11

9

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

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

我写了包括如何to get all projects代码样本的文章无论任何solutionfolders的

+0

这可以在VS Package之外完成吗? – Kurren 2016-01-28 17:31:22

+1

这只能在VS扩展中使用,因此对于任何想要解决方案中读取源项目的独立工具的人来说都没用。 – Alex 2016-08-09 09:27:54

+0

您可以获得对[正在运行的VS实例]的引用(https://github.com/wwwlicious/VSAutomate/blob/master/VSAutomate/Ide.cs#L25),或者您可以从包中访问“$ dte”经理控制台。 如果你没有VS运行,那么你需要一个替代解决方案。新的MSBuild包现在包含用于分析解决方案和项目文件的类,但这些仍然是RTM前的 – 2016-08-09 12:23:45

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

编辑:由库马尔Vaibhav的

+4

上述工作但存在一些小问题。如果你的项目被命名为“AB.CD” - 我的意思是当'。'那么正则表达式不会识别这些。 Regex projReg = new Regex( “Project \\(\”\\ {[\\ w - ] * \\} \“\\)= \”([\\ w _ (*。(cs | vcx | vb)proj)\“” ,RegexOptions.Compiled); – 2013-07-10 10:27:45

3
修订的正则表达式包括按注释“*”。

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

约翰莱德格伦的答案涉及包装内部Microsoft.Build.Construction.SolutionParser类。

6

目前,您可以在VS中使用Package Manger Console来获取该信息。如果你需要做的这个非Windows机器上使用PowerShell获取项目命令

Get-Project -All 
+0

其中** Visual Studio ** _ **'版本** ** _ – Kiquenet 2015-12-21 07:50:03

+0

我正在使用VS2013 – cezarypiatek 2015-12-21 17:38:18

+1

'Get-Project -All |安装包Nlog':cool: – guneysus 2016-07-15 08:36:06

1

,您可以使用下面的bash命令:

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

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

+0

对于VS2017,它位于VS2017'''“C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Professional \ MSBuild \ 15.0 \ Bin \ amd64 \ Microsoft.Build.dll “'''' 令人讨厌,但对于sqlprojs文件,项目类型为Unknown [''[SolutionProjectType] :: Unknown''' – Curios 2017-08-14 09:37:52

相关问题