我想从 dotnet 中的 nupkg 包获取 MetadataReference
//https://learn.microsoft.com/zh-cn/nuget/reference/nuget-client-sdk
using FileStream inputStream = new FileStream("C:\\Users\\Surface\\Downloads\\microsoft.office.interop.excel.15.0.4795.1001.nupkg", FileMode.Open);
using PackageArchiveReader reader = new PackageArchiveReader(inputStream);
NuspecReader nuspec = reader.NuspecReader;
Console.WriteLine($"ID: {nuspec.GetId()}");
Console.WriteLine($"Version: {nuspec.GetVersion()}");
Console.WriteLine($"Description: {nuspec.GetDescription()}");
Console.WriteLine($"Authors: {nuspec.GetAuthors()}");
Console.WriteLine("Dependencies:");
foreach (PackageDependencyGroup dependencyGroup in nuspec.GetDependencyGroups())
{
Console.WriteLine($" - {dependencyGroup.TargetFramework.GetShortFolderName()}");
foreach (var dependency in dependencyGroup.Packages)
{
Console.WriteLine($" > {dependency.Id} {dependency.VersionRange}");
}
}
我从msdn找到这个代码。
但我想获得这样的 MetadataReference
//from https://stackoverflow.com/questions/13138580/read-metadata-from-nupkg
var myPackage = new ZipPackage(@"C:\Path\to\MyPackage.1.0.0.nupkg");
Console.WriteLine("Id: {0}", myPackage.Id);
Console.WriteLine("Version: {0}", myPackage.Version);
Console.WriteLine(
"Assemblies: {0}",
myPackage.AssemblyReferences.Select(a => a.Name).ToArray());
但是NuGet.Core包中的ZipPackage,它不支持dotnet6。
PS:事实上我想在应用程序运行时添加 nuget 包。
尝试 NuGet.Packaging 但没有找到合适的函数
您可以使用分析器测试库:
https://github.com/dotnet/roslyn-sdk/blob/main/src/Microsoft.CodeAnalysis.Testing/README.md
你可以先获取你需要的TargetFramework的ReferenceAssemblies,例如net6.0,然后设置一个
NuGet.config
文件路径[1],然后通过指定名称和版本添加你需要的NuGet包。然后,要获取 MetadataReference
,您可以调用 ResolveAsync
var referenceAssemblies = ReferenceAssemblies.Net.Net60.WithNuGetConfigFilePath("path to NuGet.config").AddPackages(ImmutableArray.Create(new PackageIdentity("NuGetPackageId", "Version")));
var metadataReferences = await referenceAssemblies.ResolveAsync(null, default);
[1] 您传递的 NuGet.config 文件将包含一个条目,该条目指向包含 nupkg 文件的本地文件夹。如果您不这样做,它将退回到在 NuGet.org 上搜索。