在某些解决方案中,我在开发过程中使用对内部项目的直接引用,并切换到nuget引用进行发布。但是,手动将30 +项目添加到新解决方案是一项繁琐的任务。
我想知道是否有更快的方法来做到这一点。对于项目,这很容易,因为您只需复制/粘贴 xml,但解决方案文件并不容易编辑,但也许有一些技巧?
您可以使用dotnet
CLI。
对于 Linux:
dotnet sln MySolution.sln add **/*.csproj
对于 Windows PowerShell:
dotnet sln MySolution.sln add (Get-ChildItem -Recurse *.csproj)
我已经基于@JamesFaix链接对可视化工作室可扩展性进行了一些研究,并设法将这一小段代码放在一起:
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:ProjectsMyProjectMySolution.sln");
// Projects should be added to the "lib" solution-folder.
var lib = FindSolutionFolderOrCreate(sln, "lib");
// These projects should be added.
var projectPaths = new[]
{
@"C:ProjectsMyLibsLib1.csproj",
@"C:ProjectsMyLibsLib2.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 Studio2019CommunityCommon7IDEPublicAssembliesenvdte.dll</HintPath>
</Reference>
<Reference Include="EnvDTE80">
<HintPath>..........Program Files (x86)Microsoft Visual Studio2019CommunityCommon7IDEPublicAssembliesenvdte80.dll</HintPath>
</Reference>
</ItemGroup>
</Project>
我在这里使用net47
netcoreapp
因为它不允许你调试COM
对象,这真的是一种痛苦的体验。
您还需要对两个EnvDTE
文件的引用。