Подтвердить что ты не робот

Легкий способ добавить несколько существующих .csproj в решение Visual Studio?

Я проверил ветку кода С# из исходного элемента управления. Он содержит, возможно, 50 проектов в разных папках. Там не существует существующего .sln файла.

Я намеревался создать пустое решение для добавления существующих решений. Пользовательский интерфейс позволяет мне делать только один проект за раз.

Есть ли что-то, что мне не хватает? Я хотел бы указать список файлов *.csproj и каким-то образом создать файл .sln, содержащий все проекты.

4b9b3361

Ответ 1

Вот версия Bertrand script для PowerShell, которая предполагает наличие файла Src и Test рядом с файлом решения.

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

Реализация PowerShell, которая рекурсивно сканирует каталог script для файлов .csproj и добавляет их в (сгенерированный) All.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()

Ответ 3

Реализация С#, которая создает исполняемый файл, который создает решение, содержащее все уникальные *.csproj файлы из каталога и подкаталогов, в которых он выполняется.

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

Ответ 5

Возможно, вы сможете написать небольшое приложение PowerShell script или .NET, которое анализирует все проекты .csproj XML и извлекает их детали (ProjectGuid и т.д.), а затем добавляет их в файл .sln. Было бы быстрее и менее рискованно добавлять их все вручную, но тем не менее интересной задачей.

Ответ 6

Примечание: Это только для Visual Studio 2010

Найдено здесь - это классное дополнение для Visual Studio 2010, которое дает вам консоль PowerShell в VS, чтобы вы могли взаимодействовать с IDE. Среди многих других вещей, которые вы можете использовать, используя встроенную расширяемость VS, как упоминалось в @Avram, было бы довольно легко добавить файлы или проекты в решение.

Ответ 7

если вы открываете файл sln с помощью блокнота, вы можете видеть формат файла, который легко понять, но для получения дополнительной информации смотрите @Взломайте Файлы проекта и решения. Понимая структуру файлов решений, вы можете написать приложение, которое откроет все файлы проекта и напишет имя приложения, адрес и GUID в файл sln.

конечно, я думаю, если это только раз вам лучше сделать это вручную

Ответ 8

Каждый ответ, похоже, сглаживает структуру каталогов (все проекты добавляются в корень решения без уважения к иерархии папок). Итак, я закодировал собственное консольное приложение, которое генерирует решение и использует папки решений для их группировки.

Проверьте проект в GitHub

Использование

  SolutionGenerator.exe --folder C:\git\SomeSolutionRoot --output MySolutionFile.sln

Ответ 9

Зависит от версии визуальной студии.
Но название этого процесса - "Автоматизация и расширяемость для Visual Studio"
http://msdn.microsoft.com/en-us/library/t51cz75w.aspx

Ответ 10

Проверьте это: http://nprove.codeplex.com/

Это бесплатный addin для vs2010, который делает это и многое другое  если проекты находятся под tfs

Ответ 11

Основываясь на ответе Бертрана на fooobar.com/questions/172495/... - сделайте консольное приложение из этого и запустите его в корневой папке, где вы хотите, чтобы VS 2015 Solution появилось. Он работает для С# и VB (эй, будь красивым).

Он перезаписывает все существующее, но вы контролируете исходный код, правильно?

Проверьте недавно использованный .SLN файл, чтобы увидеть, что первые несколько строк заголовка writer.WriteLine() должны быть на самом деле на момент его чтения.

Не беспокойтесь о GUID проекта Ptoject("0") - Visual Studio будет работать и записывать его при сохранении .sln файла.

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

Ответ 12

Используйте расширение Visual Studio " Добавить существующие проекты ". Он работает с Visual Studio 2012, 2013, 2015, 2017.

enter image description here

Чтобы использовать расширение, откройте меню " Инструменты" и выберите " Добавить проекты".

Ответ 13

Если вы выберите "Показать все файлы" в обозревателе решений, вы можете просмотреть все файлы и файлы и выбрать их и щелкнуть правой кнопкой мыши, чтобы добавить их, используя "Включить в проект".