2010-09-27 86 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

相關問題