无法加载文件或程序集“System.Runtime,Version=7.0.0.0...”-安装.NET Core 7后,“dotnet watch run”无法工作

42
在.NET 7.0更新后,当我使用dotnet watch run命令时,出现以下错误:

未处理的异常。System.IO.FileNotFoundException: 找不到文件或程序集 'System.Runtime, Version=7.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'。文件名: 'System.Runtime, Version=7.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 在 System.Reflection.RuntimeAssembly.GetType(QCallAssembly assembly, String name, Boolean throwOnError, Boolean ignoreCase, ObjectHandleOnStack type, ObjectHandleOnStack keepAlive, ObjectHandleOnStack assemblyLoadContext) 在 System.Reflection.RuntimeAssembly.GetType(String name, Boolean throwOnError, Boolean ignoreCase) 在 System.Reflection.Assembly.GetType(String name, Boolean throwOnError) 在 System.StartupHookProvider.CallStartupHook(StartupHookNameOrPath startupHook) 在 System.StartupHookProvider.ProcessStartupHooks()

我可以通过Visual Studio成功构建和运行项目,但无法使用dotnet cli。如何解决这个错误?

1
你尝试过添加 global.json 来将 SDK 修复到先前的版本吗? - Guru Stron
我建议您更改问题的标题,以便其他人可以更轻松地搜索到它。您当前的标题太泛泛了,即人们可能会在许多其他情况下遇到此错误。我建议使用类似于“将.netcore 6升级到7后停止dotnet watch run工作”的标题。 - Mojtaba
3个回答

44
根据微软的文档,SDK 使用最新安装的版本,这是预期行为:
.NET CLI 必须为每个 dotnet 命令选择一个 SDK 版本。默认情况下,它使用机器上安装的最新 SDK,即使项目针对较早版本的 .NET 运行时。
因此,更改项目的目标框架不是真正的解决方案,但可以解决该问题。

enter image description here


更改项目的 .Net 版本不是一个简单的过程,因此作为解决方法,您可以在 CLI 命令的末尾添加一个虚词,这样就可以解决问题。
dotnet watch run xyz

另一种解决方法是,在下面的global.json中可能会有所帮助:选择要使用的.NET版本

在极少数情况下,您可能需要使用早期版本的SDK。 您可以在global.json文件中指定该版本。 “使用最新” 策略意味着您仅使用global.json来指定 .NET SDK 版本 早于已安装的最新版本。

创建一个global.json文件,并将其指向v6 SDK。global.json可以放置在项目文件层次结构的任何位置
{
    "sdk": {
        "version": "6.0.403"
    }
}

您可以通过运行以下命令来查找当前和已安装的SDK:

dotnet --info

1
你也可以添加“run”单词,例如dotnet watch run bogus。 - Lonli-Lokli
为什么虚假的单词可以工作?“dotnet watch run bogus”这会改变什么? - Doug
我最喜欢的解决方法是 dotnet watch run xyz - Mojtaba
你的第一个选项,即将目标框架升级到 dotnet7 并不是你问题的真正答案。我建议删除这部分内容。 - Mojtaba
1
为什么添加一个虚词会有任何作用? - user2565663
显示剩余3条评论

13

在这里提供更多背景信息。在更新到7.0版本的dotnet后,我开始使用cli命令时遇到了运行时问题。特别是在从.sln解决方案中的项目内使用dotnet watch

根据.NET SDK DOC的规定,此行为是可以预期的。理想情况下,我认为应该从一开始就创建一个指向期望SDK版本的global.json文件,但现在并没有这样做。

如果您转到工具>首选项>SDK位置>.NET Core (在VS上),您将能够看到所有可用版本按最新版本排序。我们要做的就是在项目内创建一个global.json文件,并提供与项目属性中定义的相同的.net版本即可解决问题。此文件如下所示:

{
  "sdk": {
    "version": "X.X.X"
  }
}

请注意,X.X.X 应该替换为该项目的.NET版本。

最终,问题是由于cli搜索.NET版本层次结构引起的,它总是查找最新版本,除非您定义此global.json文件。


1
使用最新的SDK来运行dotnet watch是可以预期的,但是根据文章的写作方式,我会预期应用程序在大多数情况下都能正常运行。然而,错误是找不到System.Runtime。这个错误将不允许它在任何情况下工作。 - Justin
@Justin 当然,就像在那里提到的“...在极少数情况下,您可能需要使用较早版本的SDK。您可以在global.json文件中指定该版本...”,这应该是个例外,但它并不是。在这种情况下,这是使事情正常工作的规则。 - Alex W. Andreza

4

对我来说,解决方案是在项目的根目录下添加一个global.json。使用你想要使用的SDK版本。

{ "sdk": { "version": "6.0.403" } }

对我来说,使用6.0.403版本强制dotnet watch使用该版本。


这比改变项目的框架更灵活,而改变框架会影响所有NuGet包的工作。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接