You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

指定global.json后dotnet publish仍报NETSDK1045:无法识别.NET 8.0目标框架

指定global.json后dotnet publish仍报NETSDK1045:无法识别.NET 8.0目标框架

问题描述

我正在尝试发布一个.NET Core项目,系统中安装了多个.NET版本,且已经通过global.json指定该项目使用.NET 8.0.3版本。但构建仍然失败,因为它尝试使用我系统中同样安装的.NET 6。我已经查阅了相关的故障排查文档,但问题依旧。

我的操作步骤

  1. 项目的目标框架已设置为net8.0,项目文件中的配置如下:
<TargetFramework>net8.0</TargetFramework>
  1. 我执行了以下发布命令:
dotnet new globaljson --sdk-version 8.0.303
dotnet --version // 输出结果为8.0.303
dotnet publish -c Release -r win-x64 --self-contained

错误信息

error NETSDK1045: The current .NET SDK does not support targeting .NET 8.0. Either target .NET 6.0 or lower, or use a version of the .NET SDK that supports .NET 8.0.

已尝试的解决方案

  • 检查PATH环境变量,确保没有硬编码指向特定.NET版本的路径
  • 确认文件树中不存在Directory.build.props文件
  • 确认未设置MSBuildSDKPath环境变量
  • 操作在PowerShell中执行,排除Visual Studio的影响
  • 确认对应架构的SDK已正确安装(SDK位于Program Files而非Program Files (x86)

补充信息

  • 运行dotnet --info的输出显示系统已安装包括8.0.303在内的多个SDK版本
  • 运行"c:\Program Files\dotnet\dotnet" --list-sdks的输出如下:
3.1.406 [c:\Program Files\dotnet\sdk]
5.0.408 [c:\Program Files\dotnet\sdk]
5.0.413 [c:\Program Files\dotnet\sdk]
6.0.402 [c:\Program Files\dotnet\sdk]
8.0.303 [c:\Program Files\dotnet\sdk]

可能的解决方案

结合你的情况,以下几个方向可以尝试排查和解决问题:

1. 确认global.json的位置是否正确

global.json需要放置在项目根目录或者其上层目录(命令执行时的工作目录的父级也可以),确保dotnet publish命令执行时能加载到这个文件。如果你是在项目子文件夹中执行的dotnet new globaljson,那么这个文件不会被项目目录的命令识别,需要将它移动到项目根目录下。

2. 确保在项目目录下执行publish命令

运行dotnet publish时,一定要切换到包含.csproj文件的目录下执行。如果在其他目录运行,可能会加载错误的配置或者找不到项目文件,导致SDK版本识别异常。

3. 清理项目缓存后重新构建

有时候项目的缓存文件会导致版本识别异常,执行以下步骤清理后重试:

  • 运行dotnet clean命令清理项目
  • 手动删除项目目录下的binobj文件夹
  • 重新执行dotnet publish命令

4. 排查是否存在其他global.json文件

检查当前项目目录的所有上层目录,看是否存在其他global.json文件。如果有,上层目录的配置会优先覆盖当前目录的设置,导致SDK版本被切换到.NET 6。可以在项目目录下运行dotnet --info,查看当前使用的SDK版本是否确实是8.0.303。

5. 尝试移除--self-contained参数测试

虽然--self-contained参数主要影响运行时,但偶尔也会和SDK版本识别产生冲突。先尝试不带该参数执行发布命令:

dotnet publish -c Release -r win-x64

如果能正常发布,再重新添加--self-contained参数尝试。

6. 强制指定SDK路径

如果以上方法都无效,可以在publish命令中强制指定SDK路径,确保使用正确的版本:

dotnet publish -c Release -r win-x64 --self-contained --sdk-path "C:\Program Files\dotnet\sdk\8.0.303"

备注:内容来源于stack exchange,提问作者Jamie Butler

火山引擎 最新活动