Come faccio a elencare in modo programmatico tutti i progetti in una soluzione? Prenderò uno script, una riga di comando o chiamate API.Come faccio a elencare in modo programmatico tutti i progetti in una soluzione?
risposta
basta leggere l'elenco dal file * .sln. Esistono sezioni "Progetto" - "EndProject".
Ecco an article from MSDN.
Se si scrive il programma come Visual Studio Add-in è possibile accedere al EnvDTE
per scoprire tutti i progetti all'interno della soluzione attualmente aperto.
Ecco uno script PowerShell che recupera i dettagli del progetto da un file .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]
}
}
So che questo è vecchio, ma è bellissimo. Mi ha salvato un sacco di tempo. – ncooper09
Se è necessario, è possibile filtrare le cartelle della soluzione aggiungendo un'ulteriore Select-String tra le righe 2 e 3 come segue: 'Select-String" {2150E333-8FDC-42A3-9474-1A3956D46DE8} "-NotMatch |' – alastairs
È possibile utilizzare i EnvDTE.Solution.Projects oggetto per arrivare a livello di codice l'accesso ai progetti in una soluzione.
Un trucco è che se si dispone di SolutionFolders nella soluzione, i progetti in queste cartelle non vengono visualizzati nella raccolta precedente.
ho scritto un articolo incluso un esempio di codice su come to get all projects indipendentemente da eventuali solutionfolders
Come questo può essere fatto al di fuori di un pacchetto VS? – Kurren
Questo può essere utilizzato solo in un'estensione VS, quindi è inutile per chiunque desideri uno strumento autonomo per la lettura di progetti sorgente in una soluzione. – Alex
È possibile ottenere un riferimento a [istanza in esecuzione di VS] (https://github.com/wwwlicious/VSAutomate/blob/master/VSAutomate/Ide.cs#L25) oppure è possibile accedere a '$ dte' dal pacchetto console di gestione. Se non hai VS in esecuzione, allora hai bisogno di una soluzione alternativa. I nuovi pacchetti MSBuild ora contengono classi per la soluzione di analisi e file di progetto, ma questi sono ancora pre-RTM –
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]);
}
Edit: ha modificato il regex per includere il secondo il commento di Kumar Vaibhav
Quanto sopra funziona, ma c'è un piccolo problema. Se i tuoi progetti sono denominati "AB.CD", intendo quando "." è lì allora la regex non riconoscerebbe quelli. Il seguente piccolo cambiamento lo farebbe funzionare - Regex projReg = new Regex ( "Project \\ (\" \\ {[\\ w -] * \\} \ "\\) = \" ([\\ w _ ] *. *) \ ", \" (. * \\. (cs | vcx | vb) proj) \ "" , RegexOptions.Compiled); –
C'è una soluzione davvero elegante qui: Parsing Visual Studio Solution files
La risposta di John Leidegren riguarda il wrapping della classe interna Microsoft.Build.Construction.SolutionParser
.
Attualmente è possibile utilizzare Package Manger Console in VS per ottenere tali informazioni. Utilizzare il comando PowerShell Get-Project
Get-Project -All
Quali ** Visual Studio ** _ ** 'versione' ** _? – Kiquenet
Sto usando VS2013 – cezarypiatek
'Get-Project -All | Install-Package Nlog': cool: – guneysus
Se avete bisogno di fare questo su una macchina non di Windows, è possibile utilizzare il seguente comando Bash:
grep "Project(" NameOfYourSolution.sln | cut -d'"' -f4
Poiché Visual Studio 2013 Microsoft.Build .dll fornisce un oggetto SolutionFile con alcune funzioni molto utili.
Ecco un esempio dell'utilizzo della versione v14.0 per elencare il percorso relativo di tutti i progetti nell'ordine in cui appaiono nella soluzione.
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
Ci sono un sacco di altre proprietà per l'oggetto di progetto (ProjectName, AbsolutePath, configurazioni ecc) che possono essere di uso. Nell'esempio precedente ho utilizzato ProjectType per filtrare le cartelle delle soluzioni.
Per VS2017, è in VS2017 '' '" C: \ Programmi (x86) \ Microsoft Visual Studio \ 2017 \ Professional \ MSBuild \ 15.0 \ Bin \ amd64 \ Microsoft.Build.dll "' '' E fastidioso, ma per i file sqlprojs, il tipo di progetto è Sconosciuto '' '[SolutionProjectType] :: Unknown''' – Curios
@Kiquenet Ho paura di non aver capito il tuo commento –
non c'è ** Parser C# class ** per leggere _sln files_? Simile a *** http: //stackoverflow.com/questions/707107/parsing-visual-studio-solution-files*** ** http: //stackoverflow.com/questions/1243022/parsing-tnsnames-ora-in -visual-c-sharp-2008 ** – Kiquenet