Façon facile d'ajouter plusieurs existants.csproj à une Solution de studio visuel?

j'ai vérifié une branche du code C du contrôle source. Il contient peut-être 50 projets dans différents dossiers. Il n'y a pas d'existant .la sln fichier se trouve.

j'avais l'intention de créer une solution vierge pour ajouter des solutions existantes. L'iu ne me permet de faire ce projet qu'une seule fois.

<!-- Y a-t-il quelque chose que je manque? J'aimerais préciser une liste de *.csproj fichiers et en quelque sorte venir avec un .fichier sln qui contient tous les projets.

32
demandé sur p.campbell 2009-12-12 00:39:45

13 réponses

Voici une version PowerShell du script de Bertrand qui suppose un répertoire Src et Test à côté du fichier solution.

function GetGuidFromProject([string]$fileName) {
    $content = Get-Content $fileName

    $xml = [xml]$content
    $obj = $xml.Project.PropertyGroup.ProjectGuid

    return [Guid]$obj[0]
}

$slnPath = "C:\Project\Foo.sln"

$solutionDirectory = [System.IO.Path]::GetDirectoryName($slnPath)

$srcPath = [System.IO.Path]::GetDirectoryName($slnPath)
$writer = new-object System.IO.StreamWriter ($slnPath, $false, [System.Text.Encoding]::UTF8)

$writer.WriteLine("Microsoft Visual Studio Solution File, Format Version 12.00")
$writer.WriteLine("# Visual Studio 2013")

$projects = gci $srcPath -Filter *.csproj -Recurse

foreach ($project in $projects) {
   $fileName = [System.IO.Path]::GetFileNameWithoutExtension($project)

   $guid = GetGuidFromProject $project.FullName

   $slnRelativePath = $project.FullName.Replace($solutionDirectory, "").TrimStart("\")

   # Assume the project is a C# project {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
   $writer.WriteLine("Project(""{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"") = ""$fileName"", ""$slnRelativePath"",""{$($guid.ToString().ToUpper())}""")
   $writer.WriteLine("EndProject")
}

$writer.Flush()
$writer.Close()
$writer.Dispose()
2
répondu Michael Baker 2015-10-07 02:05:41

une implémentation PowerShell qui scanne récursivement le répertoire de script.csproj fichiers et les ajoute à un (généré).sln:

$scriptDirectory = (Get-Item $MyInvocation.MyCommand.Path).Directory.FullName
$dteObj = [System.Activator]::CreateInstance([System.Type]::GetTypeFromProgId("VisualStudio.DTE.12.0"))

$slnDir = ".\"
$slnName = "All"

$dteObj.Solution.Create($scriptDirectory, $slnName)
(ls . -Recurse *.csproj) | % { $dteObj.Solution.AddFromFile($_.FullName, $false) }

$dteObj.Solution.SaveAs( (Join-Path $scriptDirectory 'All.sln') ) 

$dteObj.Quit()
21
répondu Mikkel Christensen 2015-08-19 02:24:40

une implémentation C# qui produit un exécutable, qui crée une solution contenant tous les *uniques.les fichiers csproj du répertoire et des sous-répertoires dans lesquels il est exécuté.

class Program
{
  static void Main(string[] args)
  {
    using (var writer = new StreamWriter("All.sln", false, Encoding.UTF8))
    {
      writer.WriteLine("Microsoft Visual Studio Solution File, Format Version 11.00");
      writer.WriteLine("# Visual Studio 2010");

      var seenElements = new HashSet<string>();
      foreach (var file in (new DirectoryInfo(System.IO.Directory.GetCurrentDirectory())).GetFiles("*.csproj", SearchOption.AllDirectories))
      {
        string fileName = Path.GetFileNameWithoutExtension(file.Name);

        if (seenElements.Add(fileName))
        {
          var guid = ReadGuid(file.FullName);
          writer.WriteLine(string.Format(@"Project(""0"") = ""{0}"", ""{1}"",""{2}""", fileName, file.FullName, guid));
          writer.WriteLine("EndProject");
        }
      }
    }
  }

  static Guid ReadGuid(string fileName)
  {
    using (var file = File.OpenRead(fileName))
    {
      var elements = XElement.Load(XmlReader.Create(file));
      return Guid.Parse(elements.Descendants().First(element => element.Name.LocalName == "ProjectGuid").Value);
    }
  }
}
15
répondu Bertrand 2013-06-10 09:23:20

Il y a une extension pour VS disponible, capable d'additionner tous les projets dans le répertoire sélectionné (et plus):

http://www.cyotek.com/blog/visual-studio-extension-for-adding-multiple-projects-to-a-solution

8
répondu kwesolowski 2015-02-01 21:24:17

vous pourriez être en mesure d'écrire un petit script PowerShell ou une application .Net qui analyse tous les projets.csproj XML et extrait leurs détails (Guide de projet, etc.) puis de les ajouter dans le .la sln fichier. Il serait plus rapide et moins risqué de les ajouter tous à la main, mais un défi intéressant néanmoins.

4
répondu Chris Fulstow 2009-12-11 21:54:36

Remarque: Ce n'est que pour Visual Studio 2010

ici est cool add in pour Visual Studio 2010 qui vous donne une console PowerShell en VS pour vous permettre d'interagir avec l'IDE. Parmi beaucoup d'autres choses que vous pouvez faire en utilisant L'extensibilité VS intégrée comme mentionné par @Avram, il serait assez facile d'ajouter des fichiers ou des projets à une solution.

3
répondu smaclell 2010-04-24 17:10:42

si vous ouvrez le fichier sln avec notepad vous pouvez voir le format du fichier qui est facile à comprendre mais pour plus d'info jetez un oeil @ Pirater le Projet et les Fichiers de Solution .comprendre la structure des fichiers de solution vous pouvez écrire une application qui ouvrira tous les fichiers de projet et écrira le nom de l'application ,l'adresse et le guide au fichier sln .

bien sûr, je pense que si c'est juste une fois que vous mieux de le faire manuellement

1
répondu Asha 2009-12-11 23:30:23

chaque réponse semble aplatir la structure du répertoire (tous les projets sont ajoutés à la solution root, sans respecter la hiérarchie du répertoire). Ainsi, j'ai codé ma propre application de console qui génère la solution et utilise des dossiers de solution pour les grouper.

découvrez le projet GitHub

Utilisation

  SolutionGenerator.exe --folder C:\git\SomeSolutionRoot --output MySolutionFile.sln
1
répondu Gerardo Grignoli 2017-09-24 18:23:00

dépend de la version visual studio.

Mais le nom de ce processus est "Automation et extensibilité pour Visual Studio"

http://msdn.microsoft.com/en-us/library/t51cz75w.aspx

0
répondu Avram 2009-12-11 22:06:46

Check this out: http://nprove.codeplex.com/

c'est un addin gratuit pour vs2010 qui fait cela et plus si les projets sont sous la tsf

0
répondu Jose Luis 2012-12-12 07:57:00

en S'appuyant sur la réponse de Bertrand à https://stackoverflow.com/a/16069782/492 - Créer une application console à partir de cela et l'exécuter dans le dossier racine où vous voulez que la Solution VS 2015 apparaisse. Il fonctionne pour C# & VB (hey! être gentil).

il écrase tout ce qui existe mais vous contrôlez les sources, non?

cochez une réponse récente .La SLN fichier pour voir ce que les premiers writer.WriteLine() lignes d'en-tête doit être en fait au moment où vous lisez ceci.

Ne vous inquiétez pas A propos du projet type GUID Ptoject("0") - Visual Studio s'en chargera et l'écrira quand vous enregistrerez le .la sln fichier.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace AddAllProjectsToNewSolution
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("starting");
            using (var writer = new StreamWriter("AllProjects.sln", false, Encoding.UTF8))
            {
                writer.WriteLine("Microsoft Visual Studio Solution File, Format Version 14.00");
                writer.WriteLine("# Visual Studio 14");
                writer.WriteLine("VisualStudioVersion = 14.0.25420.1");
                var seenElements = new HashSet<string>();

                foreach (var file in (new DirectoryInfo(Directory.GetCurrentDirectory())).GetFiles("*.*proj", SearchOption.AllDirectories))
                {
                    string extension = file.Extension;
                    if (extension != ".csproj" && extension != ".vbproj")
                    {
                        Console.WriteLine($"ignored {file.Name}");
                        continue;
                    }

                    Console.WriteLine($"adding {file.Name}");

                    string fileName = Path.GetFileNameWithoutExtension(file.Name);

                    if (seenElements.Add(fileName))
                    {
                        var guid = ReadGuid(file.FullName);
                        writer.WriteLine($"Project(\"0\") = \"{fileName}\", \"{GetRelativePath(file.FullName)} \", \"{{{guid}}}\"" );
                        writer.WriteLine("EndProject");
                    }

                } 
            }
             Console.WriteLine("Created AllProjects.sln. Any key to close");
             Console.ReadLine();
        }

        static Guid ReadGuid(string fileName)
        {
            using (var file = File.OpenRead(fileName))
            {
                var elements = XElement.Load(XmlReader.Create(file));
                return Guid.Parse(elements.Descendants().First(element => element.Name.LocalName == "ProjectGuid").Value);
            }
        }
        // https://stackoverflow.com/a/703292/492
        static string GetRelativePath(string filespec, string folder = null)
        {
            if (folder == null)
                folder = Environment.CurrentDirectory;

            Uri pathUri = new Uri(filespec);
            // Folders must end in a slash
            if (!folder.EndsWith(Path.DirectorySeparatorChar.ToString()))
                folder += Path.DirectorySeparatorChar;

            Uri folderUri = new Uri(folder);
            return Uri.UnescapeDataString(folderUri.MakeRelativeUri(pathUri).ToString().Replace('/', Path.DirectorySeparatorChar));
        }
    }
}
0
répondu CAD bloke 2017-05-23 12:02:31

Utiliser L'Extension De Visual Studio " Ajouter Des Projets Existants". Il fonctionne avec Visual Studio 2012, 2013, 2015, 2017.

enter image description here

pour utiliser l'extension, ouvrez le Outils menu et choisir Ajouter Des Projets.

0
répondu Marco Thomazini 2018-09-24 21:27:44

si vous sélectionnez 'Afficher tous les fichiers' dans L'Explorateur de solutions, vous pouvez afficher tous les fichiers et les folers et les sélectionner et cliquez avec le bouton droit de la souris pour les ajouter en utilisant 'inclure dans le projet'.

-2
répondu Gabriël 2011-07-29 14:15:54