将多个现有.csproj添加到Visual Studio解决方案的简便方法?

Mic*_*art 35 projects-and-solutions csproj visual-studio

我从源代码管理中检查了一个C#代码分支.它包含各种文件夹中的50个项目.没有找到现有的.sln文件.

我打算创建一个空白解决方案来添加现有解决方案.用户界面只允许我一次完成这个项目.

有什么我想念的吗?我想指定一个*.csproj文件列表,并以某种方式提出一个包含所有项目的.sln文件.

小智 22

PowerShell实现,以递归方式扫描脚本目录中的.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()
Run Code Online (Sandbox Code Playgroud)

  • 我一直认为$ dteObj.Solution为空.你是怎么解决这个问题的? (3认同)

Ber*_*and 15

生成可执行文件的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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


iCo*_*ime 14

这里已经有很多答案,但没有一个像这个 powershell oneliner 那样清晰

Get-ChildItem -Recurse -Include *.csproj | ForEach-Object { dotnet sln add $_ }
Run Code Online (Sandbox Code Playgroud)


kwe*_*ski 8

VS的扩展可用,能够添加所选目录中的所有项目(以及更多):

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


Mar*_*ini 8

使用 Visual Studio 扩展“添加现有项目”。它适用于 Visual Studio 2012、2013、2015、2017。

在此输入图像描述

要使用该扩展,请打开“工具”菜单并选择“添加项目”

  • 尽管存在潜在不稳定的警告,但这也适用于 2019 年。 (2认同)