我如何从 dotnet 中的 nupkg 包获取 MetadataReference

问题描述 投票:0回答:1

我想从 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 但没有找到合适的函数

c# .net nuget roslyn
1个回答
0
投票

您可以使用分析器测试库:

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 上搜索。

© www.soinside.com 2019 - 2024. All rights reserved.