2010-09-27 2 views

ответ

4

просто прочитал список из * .sln файла. Существуют разделы «Проект» - «Конечный проект».
Вот an article from MSDN.

+0

@Kiquenet Боюсь, я не понял ваш комментарий –

+0

не какой-либо ** Parser C# class ** для чтения _sln files_? Аналогично *** http: //stackoverflow.com/questions/707107/parsing-visual-studio-solution-files*** ** http: //stackoverflow.com/questions/1243022/parsing-tnsnames-ora-in -визуально-c-sharp-2008 ** – Kiquenet

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

+0

Если вам нужно, вы можете отфильтровать папки решений, добавив дополнительный Select-String между строками 2 и 3 следующим образом: 'Select-String '{2150E333-8FDC-42A3-9474-1A3956D46DE8}" -NotMatch | ' – alastairs

9

Вы можете использовать EnvDTE.Solution.Projects объект, чтобы программно получить доступ к проектам в растворе.

Один из них заключается в том, что если у вас есть решения SolutionFolders в вашем решении, любые проекты в этих папках не показаны в приведенной выше коллекции.

Я написал статью, в том числе образец кода о том, как to get all projects независимо от solutionfolders

+0

How это можно сделать за пределами пакета VS? – Kurren

+1

Это может использоваться только в VS-расширении, поэтому оно бесполезно для тех, кто хочет автономного инструмента для чтения исходных проектов в решении. – Alex

+0

Вы можете получить ссылку на [исполняемый экземпляр VS] (https://github.com/wwwlicious/VSAutomate/blob/master/VSAutomate/Ide.cs#L25) или вы можете получить доступ к '$ dte' из пакета консоль менеджера. Если у вас вообще нет VS, вам нужно альтернативное решение. Новые пакеты MSBuild теперь содержат классы для анализа решений и файлов проектов, но они все еще до RTM. –

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); –

3
«*.»

Здесь действительно элегантное решение: Parsing Visual Studio Solution files

Ответ Джона Лейдегрена включает в себя обертывание внутреннего класса Microsoft.Build.Construction.SolutionParser.

6

В настоящее время вы можете использовать Package Manger Console в VS, чтобы получить эту информацию. Используйте команду PowerShell Get-Project

Get-Project -All 
+0

Какой ** Visual Studio ** _ ** 'version' ** _? – Kiquenet

+0

Я использую VS2013 – cezarypiatek

+1

'Get-Project -All | Install-Package Nlog': cool: – guneysus

1

Если вам нужно сделать это на не машине Windows, вы можете использовать следующую команду: 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 

Есть много других свойств объекта проекта (Имя_проекта, AbsolutePath, конфигураций и т.д.), которые могут быть использованы. В приведенном выше примере я использовал ProjectType для фильтрации пакетов решений.

+0

Для VS2017 он находится под VS2017 '' '' C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Professional \ MSBuild \ 15.0 \ Bin \ amd64 \ Microsoft.Build.dll "' '' И раздражает, но для файлов sqlprojs тип проекта неизвестен '' '[SolutionProjectType] :: Unknown''' – Curios

Смежные вопросы