我有以下代码示例(取自this Gist)用于将 NuGet 包及其依赖项下载到特定文件夹:
public async Task<HashSet<PackageIdentity>> InstallPackageAndDependenciesAsync(PackageIdentity identity)
{
bool allowUnlisted = false;
bool includePrelease = true;
try
{
ResolutionContext resolutionContext = new ResolutionContext(
DependencyBehavior.Lowest,
includePrelease,
allowUnlisted,
VersionConstraints.ExactMajor | VersionConstraints.ExactMinor);
INuGetProjectContext projectContext = new BlankProjectContext(Settings.Settings, new NuGetCustomLogger());
var installActions = await LocalNuGetPackageManager.PreviewInstallPackageAsync(
LocalNuGetPackageManager.PackagesFolderNuGetProject, identity,
resolutionContext, projectContext,
new[] { RemoteNuGetFeed }, Array.Empty<SourceRepository>(),
CancellationToken.None);
var sourceCache = new SourceCacheContext();
await LocalNuGetPackageManager.ExecuteNuGetProjectActionsAsync(LocalNuGetPackageManager.PackagesFolderNuGetProject, installActions, projectContext, sourceCache, CancellationToken.None);
return new HashSet<PackageIdentity>(installActions.Select(action => action.PackageIdentity));
}
catch (Exception ex)
{
throw;
}
}
这有效,但它会下载所有支持的 .NET 版本(.NET 标准 2.1、UWP、net45 等)的二进制文件
我如何配置它,以便它只下载适合特定目标框架的包版本,例如.NET 6.0?
编辑 有关如何在运行时为目标包动态加载所需程序集的信息的奖励。如果我需要修改我的 NuGet 以包含 json.deps,那很好。
我不认为您可以使用请求的框架来请求 NuGet API。 通过搜索包,您有一些元数据可以帮助您。 在找到好的元数据的同时,您必须需要搜索并下载包。
有关 NuGet 客户端的 Microsoft Doc 的更多信息:https://learn.microsoft.com/en-us/nuget/reference/nuget-client-sdk
这篇文章可以帮助您找到具有所需框架的解决方案:https://www.daveaglick.com/posts/exploring-the-nuget-v3-libraries-part-2
要仅下载适用于特定目标框架的包版本,您可以将 Framework 属性添加到 ResolutionContext 对象并将其设置为您要使用的目标框架。这是一个例子:
Framework framework = new FrameworkName(".NETCoreApp,Version=v6.0");
ResolutionContext resolutionContext = new ResolutionContext(
DependencyBehavior.Lowest,
includePrelease,
allowUnlisted,
VersionConstraints.ExactMajor | VersionConstraints.ExactMinor,
framework);
这会将目标框架设置为 .NET 6.0,因此只会下载支持 .NET 6.0 的包。
要在运行时动态加载目标包所需的程序集,您可以使用 Assembly.LoadFrom 方法从包的 lib 文件夹中加载程序集。这是一个例子:
string packageId = "MyPackage";
string packageVersion = "1.0.0";
string assemblyName = "MyAssembly.dll";
string packagePath = Path.Combine(LocalNuGetPackageManager.PackagesFolderSourceRepository.PackageSource.Source, packageId, packageVersion);
string assemblyPath = Path.Combine(packagePath, "lib", "net6.0", assemblyName);
Assembly assembly = Assembly.LoadFrom(assemblyPath);
这会从支持 .NET 6.0 的“MyPackage”版本“1.0.0”加载程序集“MyAssembly.dll”。请注意,您需要修改 assemblyName 和 framework 变量以匹配要加载的包的程序集名称和目标框架。如果包有依赖项,您还需要以类似的方式加载它们的程序集。