如何获取代表当前运行框架的NuGetFramework实例?
如何获取代表当前运行框架的NuGetFramework?
我正尝试解析NuGet包文件,确定项目引入引用DLL时应使用哪个lib子文件夹,思路是筛选出所有与当前运行框架兼容的实例。
以下代码可编译运行,但possible列表始终为空。我认为问题出在current实例不正确,它的版本是0.0.0.0,导致比较器无法正常工作:
using var packageReader = new PackageArchiveReader(packageStream); var current = new NuGetFramework(RuntimeInformation.FrameworkDescription); foreach (var i in packageReader.GetSupportedFrameworks()) { if (DefaultCompatibilityProvider.Instance.IsCompatible(i, current)) { possible.Add(i); } }
解决方法
直接用RuntimeInformation.FrameworkDescription创建NuGetFramework会导致版本识别错误,因为该字符串的格式(例如".NET 6.0.10")无法被NuGetFramework正确解析为版本号。你可以通过以下两种方式获取正确的当前框架实例:
方法1:从程序集的目标框架属性获取
这种方式适用于获取当前程序编译时的目标框架,准确性最高:
using System.Reflection; using System.Runtime.Versioning; using NuGet.Frameworks; var entryAssembly = Assembly.GetEntryAssembly(); var targetFrameworkAttr = entryAssembly.GetCustomAttribute<TargetFrameworkAttribute>(); var current = NuGetFramework.Parse(targetFrameworkAttr.FrameworkName);
方法2:解析运行时框架描述字符串
如果需要在运行时动态识别当前执行的框架,可以对RuntimeInformation.FrameworkDescription进行格式转换,提取标准的NuGet框架标识符:
using System.Runtime.InteropServices; using NuGet.Frameworks; var frameworkDesc = RuntimeInformation.FrameworkDescription; string frameworkId; if (frameworkDesc.StartsWith(".NET Core")) { var version = Version.Parse(frameworkDesc.Split(' ')[2]); frameworkId = $"netcoreapp{version.Major}.{version.Minor}"; } else if (frameworkDesc.StartsWith(".NET")) { var version = Version.Parse(frameworkDesc.Split(' ')[1]); frameworkId = $"net{version.Major}.{version.Minor}"; } else if (frameworkDesc.StartsWith(".NET Framework")) { var version = Version.Parse(frameworkDesc.Split(' ')[2]); frameworkId = $"net{version.Major}{version.Minor}"; // 例如.NET Framework 4.8对应net48 } else { // 处理其他小众框架的情况 frameworkId = frameworkDesc; } var current = NuGetFramework.Parse(frameworkId);
关键原因
NuGetFramework依赖标准的框架标识符(如net6.0、net48、netcoreapp3.1)才能正确识别版本信息,而RuntimeInformation.FrameworkDescription返回的是面向用户的友好名称,无法直接被解析为有效的NuGetFramework实例,最终导致版本号被识别为0.0.0.0,兼容性比较逻辑失效。
内容的提问来源于stack exchange,提问作者BJury
相关产品推荐
相关产品推荐

