You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Visual Studio自定义项模板中从nuget.org添加NuGet包

自定义项模板自动安装NuGet包(从nuget.org拉取)的可行方案

方案1:通过DTE调用NuGet控制台命令

直接在模板向导中使用Visual Studio的DTE对象执行Install-Package命令,无需本地存储包,自动从nuget.org拉取并安装。

在向导的ProjectItemFinishedGenerating或RunFinished方法中添加逻辑:

public void ProjectItemFinishedGenerating(ProjectItem projectItem)
{
    var dte = (DTE)ServiceProvider.GetService(typeof(DTE));
    var targetProject = projectItem.ContainingProject;
    // 替换为目标包名和版本
    var packageName = "Newtonsoft.Json";
    var packageVersion = "13.0.3";
    var nugetSource = "https://api.nuget.org/v3/index.json";

    // 执行安装命令,自动处理包下载和项目配置更新
    dte.ExecuteCommand("NuGetPackageManager.InstallPackage", 
        $"{targetProject.Name} {packageName} -Version {packageVersion} -Source {nugetSource}");
}

关键说明:

  • 命令执行后,Visual Studio会自动更新项目配置(packages.config或PackageReference)并下载包,无需手动重新加载项目。
  • 需在模板的.vstemplate文件中正确配置向导扩展,指向你的向导程序集。

方案2:直接修改项目文件触发NuGet自动恢复

针对使用PackageReference的现代项目,直接在模板中添加PackageReference节点,或在向导中修改项目文件,然后触发NuGet恢复命令。

  1. 在项模板的项目文件片段中添加(或向导中动态写入):
<ItemGroup>
  <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
  1. 在向导的RunFinished方法中触发恢复:
public void RunFinished()
{
    var dte = (DTE)ServiceProvider.GetService(typeof(DTE));
    var targetProject = dte.Solution.Projects.OfType<Project>().First(p => p.IsSelected);
    
    targetProject.Save();
    // 触发NuGet恢复,自动从nuget.org拉取缺失的包
    dte.ExecuteCommand("NuGetPackageManager.RestorePackages", targetProject.Name);
}

关键说明:

  • 此方案适配.NET Core/.NET 5+项目,也支持.NET Framework的PackageReference模式。
  • 无需处理复杂的NuGet API,依赖Visual Studio内置的恢复机制。

方案3:使用NuGet.Client库直接操作项目

通过官方NuGet.Client库,绕过DTE的Project对象,直接通过项目路径完成包安装,完全从nuget.org拉取包。

  1. 在向导项目中引用NuGet.Client相关包:NuGet.PackageManagement、NuGet.Configuration、NuGet.Packaging。
  2. 实现安装逻辑:
using NuGet.Configuration;
using NuGet.PackageManagement;
using NuGet.Packaging.Core;
using NuGet.Versioning;
using NuGet.Common;

public void InstallPackage(string projectPath)
{
    var settings = Settings.LoadDefaultSettings(projectPath);
    var sourceProvider = new SourceRepositoryProvider(settings, Repository.Provider.GetCoreV3());
    
    // 确保nuget.org源存在
    var nugetSource = sourceProvider.GetRepositories().FirstOrDefault(s => s.Source.Equals("https://api.nuget.org/v3/index.json", StringComparison.OrdinalIgnoreCase));
    if (nugetSource == null)
    {
        var packageSources = settings.GetSection<PackageSources>();
        packageSources.AddSource(new PackageSource("https://api.nuget.org/v3/index.json", "nuget.org"));
        settings.SaveToFile();
    }

    var packageManager = new PackageManager(sourceProvider, settings, projectPath);
    var packageIdentity = new PackageIdentity("Newtonsoft.Json", NuGetVersion.Parse("13.0.3"));
    
    // 同步执行安装(也可使用异步)
    packageManager.InstallPackageAsync(packageIdentity, new ResolutionContext(), new NullLogger(), false, false).Wait();
}

关键说明:

  • 此方案不依赖Visual Studio的DTE对象,灵活性更高,但需要处理NuGet配置和异步逻辑。
  • 需确保向导程序集包含NuGet.Client的依赖,或采用独立部署方式。

通用配置要求

在模板的.vstemplate文件中添加向导扩展配置:

<WizardExtension>
  <Assembly>YourWizardAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=your_public_key</Assembly>
  <FullClassName>YourWizardNamespace.YourWizardClass</FullClassName>
</WizardExtension>

内容的提问来源于stack exchange,提问作者JBartlau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 06:05:27