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

NetStandard2.0与Net6.0间NuGet依赖缺失问题咨询

问题根源及运行时暴露原因解析

一、依赖丢失的核心原因

这本质是NuGet针对不同目标框架的依赖项自动筛选机制导致的:

  • Microsoft.IdentityModel.Tokens 8.13.0的NuGet包中,针对不同目标框架有不同的依赖声明。对于net6.0这类已内置System.Text.Json的框架,它的依赖配置会标记System.Text.Json为“框架已提供”,NuGet在解析net6.0项目的依赖时,会自动跳过这个包的引入,认为不需要额外添加。
  • 但问题在于,Microsoft.IdentityModel.Tokens 8.13.0实际用到了System.Text.Json 8.0.5中的新特性或API,而net6.0内置的System.Text.Json版本(6.0.x)并不包含这些内容。这种依赖声明的“框架兼容”判断,并没有考虑到包自身对高版本API的实际需求。

另外,netstandard2.0类库作为中间依赖时,传递依赖的规则也会生效:net6.0项目在解析传递依赖时,会优先使用自身框架提供的程序集,而非类库依赖的第三方包版本,直接导致System.Text.Json 8.0.5被排除在输出目录外。

二、为何仅在运行时暴露问题

编译阶段和运行阶段的检查逻辑完全不同:

  • 编译时:编译器只验证是否存在System.Text.Json的程序集引用,net6.0内置的版本已经能满足编译层面的类型检查,所以不会报错。NuGet的依赖解析也只是做框架兼容性的匹配,不会验证具体API是否存在。
  • 运行时:CLR需要加载对应版本的程序集来执行具体方法,当代码调用到Microsoft.IdentityModel.Tokens中依赖的System.Text.Json 8.0.5特有的API时,内置的6.0.x版本无法提供这些功能,就会抛出程序集缺失或方法找不到的错误。

三、除手动添加外的解决方向

  • 显式在net6.0项目中添加System.Text.Json 8.0.5的引用,并确保依赖会被复制到输出目录:
    <PackageReference Include="System.Text.Json" Version="8.0.5">
      <PrivateAssets>none</PrivateAssets>
    </PackageReference>
    
  • 检查Microsoft.IdentityModel.Tokens是否有更新版本,部分后续版本可能修复了针对net6.0的依赖声明问题,确保高版本System.Text.Json的依赖能被正确传递。
  • 在netstandard2.0类库中显式添加System.Text.Json 8.0.5的引用,并设置<PrivateAssets>none</PrivateAssets>,强制该依赖传递到下游的net6.0项目中。

内容的提问来源于stack exchange,提问作者Dee J. Doena

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 10:33:01