在一些解决方案中,在开发过程中我使用直接引用内部项目的方式,然后在发布时切换到 nuget 引用。不过,手动将 30 多个项目添加到新解决方案中是一项繁琐的任务。
我想知道是否有更快捷的方法可以完成这个任务。对于项目来说很容易,你只需要复制/粘贴 xml 代码,但解决方案文件并不像那么容易编辑,不过也许有一些技巧?
我想知道是否有更快捷的方法可以完成这个任务。对于项目来说很容易,你只需要复制/粘贴 xml 代码,但解决方案文件并不像那么容易编辑,不过也许有一些技巧?
dotnet
命令行工具。dotnet sln MySolution.sln add **/*.csproj
对于Windows PowerShell:
dotnet sln MySolution.sln add (Get-ChildItem -Recurse *.csproj)
dotnet new sln --name MySolution
。 - CodeFox我根据 @JamesFaix 的链接进行了一些关于Visual Studio可扩展性的研究,我成功地编写了这个小代码片段:
using System;
using System.IO;
using System.Linq;
using EnvDTE;
using EnvDTE80;
class Program
{
static void Main(string[] args)
{
// VS2019
var dteType = Type.GetTypeFromProgID("VisualStudio.DTE.16.0", true);
var dte = (EnvDTE.DTE)System.Activator.CreateInstance(dteType);
var sln = (SolutionClass)dte.Solution;
// Solution to add projects to
sln.Open(@"C:\Projects\MyProject\MySolution.sln");
// Projects should be added to the "lib" solution-folder.
var lib = FindSolutionFolderOrCreate(sln, "lib");
// These projects should be added.
var projectPaths = new[]
{
@"C:\Projects\MyLibs\Lib1.csproj",
@"C:\Projects\MyLibs\Lib2.csproj"
};
foreach (var path in projectPaths)
{
var name = Path.GetFileNameWithoutExtension(path);
// If project not already in the solution-folder then add it.
if(!(lib.Parent.ProjectItems.Cast<ProjectItem>().Any(pi => pi.Name == name)))
{
lib.AddFromFile(path);
}
}
dte.Solution.Close(true);
}
private static SolutionFolder FindSolutionFolderOrCreate(SolutionClass sln, string folderName)
{
foreach (var x in sln.Projects)
{
if (x is Project p && p.Name.Equals(folderName, StringComparison.OrdinalIgnoreCase))
{
return (SolutionFolder)p.Object;
}
}
var proj = (sln as Solution2).AddSolutionFolder(folderName);
return (SolutionFolder)proj.Object;
}
}
*.csproj
文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<!--<TargetFramework>netcoreapp2.2</TargetFramework>-->
<TargetFramework>net47</TargetFramework>
<EnableUnmanagedDebugging>true</EnableUnmanagedDebugging>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DebugType>full</DebugType>
<DebugSymbols>true</DebugSymbols>
</PropertyGroup>
<ItemGroup>
<Reference Include="EnvDTE">
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\PublicAssemblies\envdte.dll</HintPath>
</Reference>
<Reference Include="EnvDTE80">
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\PublicAssemblies\envdte80.dll</HintPath>
</Reference>
</ItemGroup>
</Project>
我在这里使用net47
,因为netcoreapp
不允许您调试COM
对象,这使得它真的是一种痛苦的经历。
您还需要引用两个EnvDTE
文件。
SolutionClass
强制转换为(sln as Solution2)
- 真是太难了 :-o - t3chb0t
AddProjectReference(fileName)
这样的visual-studio
API 在 cmd-line 级别上使用;-] - t3chb0t