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

.NET6中已废弃Nuget.Core的替代方案咨询

.NET6 运行时下载安装NuGet包(替代废弃的NuGet.Core)

在.NET6环境下,官方推荐用NuGet.Protocol和NuGet.Packaging两个包替代已废弃的NuGet.Core,这俩是NuGet官方维护的核心库,完全支持自定义源(比如你用的Baget),可以实现运行时下载、安装NuGet包的需求。

第一步:安装依赖包

先在项目里添加这两个NuGet包:

dotnet add package NuGet.Protocol
dotnet add package NuGet.Packaging

替换后的实现代码

下面是对应你原有功能的完整实现,支持指定包ID、版本、Baget源和输出目录:

using NuGet.Common;
using NuGet.Configuration;
using NuGet.Packaging;
using NuGet.Packaging.Core;
using NuGet.Protocol;
using NuGet.Protocol.Core.Types;
using NuGet.Versioning;
using System.IO.Compression;

async Task GetPackageByNameAndVersionAsync(string packageId, string versionString, string feedUrl, string outputPath)
{
    // 使用空日志(如需调试可替换为自定义ILogger实现)
    var logger = NullLogger.Instance;

    // 创建Baget源的V3仓库(Baget完全支持NuGet V3协议)
    var sourceRepository = Repository.Factory.GetCoreV3(feedUrl);

    // 获取包元数据查询资源
    var packageMetadataResource = await sourceRepository.GetResourceAsync<PackageMetadataResource>();

    // 解析版本号
    if (!NuGetVersion.TryParse(versionString, out var packageVersion))
    {
        Console.WriteLine("版本号格式无效,请检查输入");
        return;
    }

    // 定位目标包
    var packageIdentity = new PackageIdentity(packageId, packageVersion);
    var packageMetadata = await packageMetadataResource.GetMetadataAsync(
        packageIdentity,
        new SourceCacheContext(),
        logger,
        CancellationToken.None);

    if (packageMetadata == null)
    {
        Console.WriteLine($"未在源 {feedUrl} 中找到包 {packageId} 版本 {versionString}");
        return;
    }

    // 获取包下载资源
    var packageDownloadResource = await sourceRepository.GetResourceAsync<PackageDownloadResource>();

    // 下载包到内存流
    using var packageStream = await packageDownloadResource.GetPackageStreamAsync(
        packageIdentity,
        new SourceCacheContext(),
        logger,
        CancellationToken.None);

    // 创建输出目录(不存在则自动创建)
    Directory.CreateDirectory(outputPath);

    // 解压nupkg包到指定目录(模拟安装操作,NuGet包本质是ZIP压缩包)
    ZipArchive.ExtractToDirectory(packageStream, outputPath, true);

    Console.WriteLine($"包 {packageId} {versionString} 已成功下载并解压到 {outputPath}");
}

关键细节说明

  • 源兼容性:用GetCoreV3创建V3版本仓库,Baget默认支持V3源,无需额外配置。
  • 包验证:先通过PackageMetadataResource确认包存在,避免无效下载。
  • 安装逻辑:NuGet包本质是ZIP文件,解压到指定目录就完成了"安装",如果需要加载包内的DLL,可以用AssemblyLoadContext或Assembly.LoadFrom实现(注意.NET6的程序集加载规则)。
  • 依赖处理:如果需要自动下载依赖包,可以额外使用PackageDependencyResolver类递归处理依赖,根据你的需求扩展即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 03:32:34