You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取代表当前运行框架的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 01:07:27