要从项目引用的程序集中检索NuGet包的依赖,可以使用以下解决方法:
在ASP.NET Core 2.2项目中,使用NuGet包管理器安装以下两个包:
在需要检索NuGet包依赖的代码文件中,添加以下代码:
using Microsoft.Extensions.DependencyModel;
using NuGet.Protocol;
using NuGet.Protocol.Core.Types;
using NuGet.Versioning;
using System;
using System.Collections.Generic;
using System.Linq;
public static class NuGetDependencyHelper
{
public static IList GetNuGetPackageDependencies(string assemblyPath)
{
var dependencies = new List();
var dependencyContext = DependencyContext.Load(assemblyPath);
var nuGetRepository = Repository.Factory.GetCoreV3("https://api.nuget.org/v3/index.json");
foreach (var target in dependencyContext.Targets)
{
var framework = target.Framework;
var runtimeIdentifier = target.RuntimeIdentifier;
var dependenciesByFramework = target
.Dependencies
.Where(d => d.Type == "package")
.GroupBy(d => d.Name);
foreach (var dependencyGroup in dependenciesByFramework)
{
var dependency = dependencyGroup.First();
var packageIdentity = new PackageIdentity(dependency.Name, dependency.Version);
var resource = nuGetRepository
.GetResource();
var versions = resource
.GetAllVersionsAsync(dependency.Name, new SourceCacheContext())
.ConfigureAwait(false)
.GetAwaiter()
.GetResult();
var maxVersion = versions
.Where(v => v.Version.Major == packageIdentity.Version.Major)
.OrderByDescending(v => v.Version)
.FirstOrDefault();
dependencies.Add(new NuGetPackage
{
Name = dependency.Name,
Version = packageIdentity.Version.ToString(),
TargetFramework = framework,
RuntimeIdentifier = runtimeIdentifier,
LatestVersion = maxVersion?.Version.ToString()
});
}
}
return dependencies;
}
}
public class NuGetPackage
{
public string Name { get; set; }
public string Version { get; set; }
public string TargetFramework { get; set; }
public string RuntimeIdentifier { get; set; }
public string LatestVersion { get; set; }
}
GetNuGetPackageDependencies
方法来获取指定程序集的NuGet包依赖。例如:var assemblyPath = "path/to/your/assembly.dll";
var dependencies = NuGetDependencyHelper.GetNuGetPackageDependencies(assemblyPath);
foreach (var dependency in dependencies)
{
Console.WriteLine($"Name: {dependency.Name}");
Console.WriteLine($"Version: {dependency.Version}");
Console.WriteLine($"Target Framework: {dependency.TargetFramework}");
Console.WriteLine($"Runtime Identifier: {dependency.RuntimeIdentifier}");
Console.WriteLine($"Latest Version: {dependency.LatestVersion}");
Console.WriteLine();
}
这将打印出程序集的每个NuGet包依赖的名称、版本、目标框架、运行时标识和最新版本。