.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
相关产品推荐
相关产品推荐

