37

ソース管理から C# コードのブランチをチェックアウトしました。さまざまなフォルダーにおそらく 50 のプロジェクトが含まれています。既存の .sln ファイルが見つかりません。

既存のソリューションを追加する空のソリューションを作成するつもりでした。UI では、一度に 1 つのプロジェクトしか実行できません。

足りないものはありますか?*.csproj ファイルのリストを指定して、どうにかしてすべてのプロジェクトを含む .sln ファイルを作成したいと考えています。

4

16 に答える 16

22

スクリプト ディレクトリで .csproj ファイルを再帰的にスキャンし、それらを (生成された) All.sln に追加する PowerShell 実装:

$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()
于 2010-05-17T13:00:06.073 に答える
16

実行可能ファイルを生成する AC# 実装。これにより、実行されるディレクトリとサブディレクトリからすべての一意の *.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);
    }
  }
}
于 2013-04-17T20:34:57.537 に答える
5

Visual Studio 拡張機能「既存のプロジェクトを追加」を使用します。Visual Studio 2012、2013、2015、2017 で動作します。

ここに画像の説明を入力

拡張機能を使用するには、[ツール] メニューを開き、[プロジェクトの追加] を選択します。

于 2018-09-24T21:27:44.627 に答える
4

すべてのプロジェクトの .csproj XML を解析し、その詳細 (ProjectGuid など) を抽出して .sln ファイルに追加する小さな PowerShell スクリプトまたは .NET アプリを作成できる場合があります。それらをすべて手動で追加する方が迅速でリスクが少ないですが、それでも興味深い課題です。

于 2009-12-11T21:54:36.587 に答える
3

注:これは Visual Studio 2010 専用です。

ここにあるのは、Visual Studio 2010 用の優れアドインで、VS で PowerShell コンソールを提供して IDE と対話できるようにします。@Avram で言及されているように、組み込みの VS 拡張機能を使用して実行できる他の多くのことの中でも、ファイルやプロジェクトをソリューションに追加するのは非常に簡単です。

于 2010-04-24T17:10:42.427 に答える
3

これは、ソリューション ファイルの隣に Src および Test ディレクトリがあることを前提とする Bertrand のスクリプトの PowerShell バージョンです。

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()
于 2015-10-07T02:05:41.557 に答える
1

sln ファイルをメモ帳で開くと、ファイルのフォーマットが分かりやすいのがわかりますが、詳細については、@ Hack the Project and Solution Filesを参照してください。ソリューション ファイルの構造を理解すると、アプリケーションを作成できます。すべてのプロジェクト ファイルを開き、アプリケーション名、アドレス、および GUID を sln ファイルに書き込みます。

もちろん、一度だけなら手動でやったほうがいいと思います

于 2009-12-11T22:16:57.340 に答える
1

すべての回答は、ディレクトリ構造を平坦化しているようです (すべてのプロジェクトは、フォルダー階層を考慮せずにソリューション ルートに追加されます)。そこで、ソリューションを生成し、ソリューション フォルダーを使用してそれらをグループ化する独自のコンソール アプリをコーディングしました。

GitHubでプロジェクトをチェックアウトする

使用法

  SolutionGenerator.exe --folder C:\git\SomeSolutionRoot --output MySolutionFile.sln
于 2017-09-24T18:23:00.820 に答える
0

VisualStudioのバージョンによって異なります。
ただし、このプロセスの名前は「VisualStudioの自動化と拡張性」
http://msdn.microsoft.com/en-us/library/t51cz75w.aspxです。

于 2009-12-11T22:06:46.457 に答える
0

これをチェックしてください: http://nprove.codeplex.com/

これは、プロジェクトが tfs の下にある場合にそれ以上のことを行う vs2010 用の無料のアドインです。

于 2012-12-12T07:57:00.413 に答える
0

https://stackoverflow.com/a/16069782/492での Bertrand の回答に基づいて構築- これからコンソール アプリを作成し、VS 2015 ソリューションを表示するルート フォルダーで実行します。C# と VB で動作します (ちょっと!いいですね)。

ソース管理以外の既存のものはすべて上書きされますよね?

最近使用した .SLN ファイルをチェックして、writer.WriteLine() これを読むまでに最初の数行のヘッダー行が実際にどうあるべきかを確認してください。

プロジェクトの種類の GUID について心配する必要はありませんPtoject("0")。.sln ファイルを保存すると、Visual Studio によってそれが処理され、書き込まれます。

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));
        }
    }
}
于 2016-10-10T01:10:06.297 に答える
-2

ソリューション エクスプローラーで [すべてのファイルを表示] を選択すると、すべてのファイルとフォラーを表示して選択し、右クリックして [プロジェクトに含める] を使用して追加できます。

于 2011-07-29T14:15:54.947 に答える