无法从 FW 4.8 控制台应用加载文件或程序集“netstandard”

Could not load file or assembly 'netstandard' from FW 4.8 console app

提问人:Jonas Rembratt 提问时间:11/8/2023 最后编辑:Jonas Rembratt 更新时间:11/9/2023 访问量:40

问:

我有一个面向 .NET Framework 4.8 的旧控制台应用程序。它加载了一些都支持 .NET Standard 2.0 和 2.1 的 Nuget。控制台应用程序构建良好,但是在加载第一个Nuget DLL时,我收到此运行时错误:

System.IO.FileNotFoundException: Could not load file or assembly 'netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies. The system cannot find the file specified.
File name: 'netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' ---> System.IO.FileNotFoundException: Could not load file or assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies. The system cannot find the file specified.
File name: 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'

因此,兼容性方面的 Framework 4.8 应该可以与 .NET Standard 2.0 一起使用。运行时无法加载 netstandard 2.0 或 2.1 是否有充分的理由?

[编辑] 控制台应用的隐式依赖项的屏幕截图enter image description here

net-standard-2.1

评论

0赞 Jonas Rembratt 11/8/2023
2.1 如何具体配置?我只指定了控制台应用程序 (Framework 4.8) 的目标。MSBuild 不应该自动包含来自该信息的正确二进制文件,来自 Nugets,同时支持 netstandard 2.0 和 2.1?
0赞 Jonas Rembratt 11/8/2023
我编辑了 OP,以包含控制台应用隐式依赖项的屏幕截图。它确实包括 netstandard 2.0

答:

0赞 PMF 11/8/2023 #1

.Netstandard 2.1 需要 .NET 5.0+。.NET Framework 4.8 不支持它。看起来您正在尝试加载仅针对 netstandard 2.1 的程序集(也许您的一个 nuget 不支持 2.0,或者当它有多个目标时,由于某种原因选择了错误的目标)。

评论

0赞 Jonas Rembratt 11/8/2023
因此,当可执行文件引用具有多目标支持的 Nuget 时,编译器/链接器无法确定它需要正确的 Nugets(在本例中为 netstandard 2.0)?这些天我能/需要做些什么来让它选择正确的目标吗?
0赞 PMF 11/8/2023
@JonasRembratt 通常,这工作正常,但您的设置中可能出了问题,可能是由于间接依赖关系。中的 Nuget 处理。NET4.8 仍然部分损坏 IIRC。我想您需要跟踪导致错误的程序集(或继续并将目标运行时更改为 .NET 6.0)
0赞 Jonas Rembratt 11/8/2023
查看隐式依赖项属性,netstandard 二进制文件应位于 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\。NETFramework\v4.8\Facades。我检查了一下,确实如此。运行时库加载器(我认为它被称为“Fusion”)不应该能够自动包含该位置吗?也许我的机器上的某些 .NET 配置已损坏?
1赞 Jonas Rembratt 11/9/2023 #2

好的,所以问题只是项目是如何搭建脚手架的,文件中的程序集统一和升级。显然,默认设置是始终将 netstandard 升级到 2.1,这不适用于框架 4.8。不确定这是否是 Rider 项目模板中的错误,或者 VS 是否也这样做。通过简单地注释掉程序集升级指令,问题就解决了。App.config

enter image description here

另外: https://learn.microsoft.com/en-us/dotnet/framework/configure-apps/redirect-assembly-versions

[编辑]:展望未来,每次更改项目设置(例如更改项目引用或添加/删除Nuget包)时,App.config文件似乎都会被重写。我忘记了旧框架项目到底有多混乱。