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

Ome*_*r K 44 .net c# dotnet-cli .net-7.0

.Net 7.0更新后,当我使用时dotnet watch run出现此错误:

未处理的异常。System.IO.FileNotFoundException:无法加载文件或程序集“System.Runtime,版本= 7.0.0.0,文化=中性,PublicKeyToken = b03f5f7f11d50a3a”。该系统找不到指定的文件。文件名:'System.Runtime,Version=7.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a' at System.Reflection.RuntimeAssembly.GetType(QCallAssembly程序集,字符串名称,布尔值 throwOnError,布尔值ignoreCase,ObjectHandleOnStack类型,ObjectHandleOnStack keepAlive,ObjectHandleOnStack assemblyLoadContext) 在 System.Reflection.RuntimeAssembly.GetType(String name, Boolean throwOnError, BooleanignoreCase) 在 System.Reflection.Assembly.GetType(String name, Boolean throwOnError) 在 System.StartupHookProvider.CallStartupHook(StartupHookNameOrPathstartupHook) 在 System.StartupHookProvider。进程启动钩子()

我可以使用 Visual Studio 成功构建并运行该项目,但无法使用dotnet cli。如何修复此错误?

Ome*_*r K 45

根据 Microsoft文档,SDK 使用最新安装的版本,这是预期的行为:

.NET CLI 必须为每个 dotnet 命令选择 SDK 版本。默认情况下,它使用计算机上安装的最新 SDK,即使项目面向早期版本的 .NET 运行时也是如此。

所以,这不是一个真正的解决方案,而是改变项目的目标框架解决了问题。

在此输入图像描述


更改项目的 .Net 版本并不是一个简单的过程,因此作为解决方法,您可以在 CLI 命令末尾添加一个虚拟单词,它会起作用:

dotnet watch run xyz
Run Code Online (Sandbox Code Playgroud)

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

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

创建一个 global.json 文件并将其指向 v6 SDK。global.json 可以放置在项目文件层次结构中的任何位置。

{
    "sdk": {
        "version": "6.0.403"
    }
}
Run Code Online (Sandbox Code Playgroud)

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

dotnet --info
Run Code Online (Sandbox Code Playgroud)

  • 还可以用word添加run,即dotnet watch run bogus (2认同)

小智 13

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

根据此处的 .NET SDK DOC ,此行为是预期的。理想情况下,我认为global.json应该从一开始就创建一个指向预期 SDK 版本的文件,但事实并非如此。

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

{
  "sdk": {
    "version": "X.X.X"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

最后,问题是由 .NET 版本搜索的层次结构引起的cli,除了您定义此文件的情况之外,它将始终查找最新版本global.json


小智 5

对我来说,解决方案是将 global.json 添加到项目的根目录中。有了SDK版本,你想用就用。

{“sdk”:{“版本”:“6.0.403”}}

对于我来说 6.0.403 强制 dotnet watch 使用这个版本。