【Bug】Rider编译UE时,报错Microsoft.NET.Sdk.WorkloadAutoImportPropsLocator 缺失

137 阅读2分钟

585353ca-59ec-42a9-9d8c-28c05ba0294d.png

【起因是我想用rider编译虚幻引擎,但是发现一直不成功,找不到这个文件】

一开始我以为是自己安装的不够完整,于是卸载又安装.NET SDK

但是无论怎么安装.NET 8.0.XXX SDK,反复安装卸载,都依然没有这个文件Files\dotnet\sdk\8.0.413\Sdks\Microsoft.NET.SDK.WorkloadAutoImportPropsLocator\Sdk”


【咨询AI得到原因】

image.png


解决办法

之所以记录,是因为这个问题真的找了好久的办法,终于试到以下办法可以编译通过了,太不容易了

方法一: 先禁用 Workload 解析(官方推荐的临时解法)

PowerShell(管理员) 执行(设为长期,对 Rider/VS 也生效):

setx MSBuildEnableWorkloadResolver false

作用:MSBuild 会跳过 Microsoft.NET.Sdk.ImportWorkloads.props 的自动导入逻辑,很多环境到这一步已经能编过了。
若你已设过这变量也没用,继续执行 B 步。

image.png

【尝试了方法一,我就可以编译通过了】


其他方法没尝试

方法二: 手工放一个“最小占位 SDK”(0 逻辑、只负责不报错)

原理:那条出错的语句是
<Import Project="AutoImport.props" Sdk="Microsoft.NET.SDK.WorkloadAutoImportPropsLocator" />
它只要在 你正在用的 SDK 的 Sdks\Microsoft.NET.Sdk.WorkloadAutoImportPropsLocator\Sdk 里找到一个 AutoImport.props 就不会报错。
我们创建一个空实现AutoImport.props(以及可选的 Sdk.props),不改变任何构建行为,只是避免解析失败。

把下面整段 原样 复制到 PowerShell(管理员)里执行(路径按你现在使用的 SDK 版本改;你之前是 D:\dotnet-sdk\sdk\8.0.316):

# 1) 把路径改成你当前 dotnet --list-sdks 显示的那条
$SdkRoot = "D:\dotnet-sdk\sdk\8.0.316"
$Locator = Join-Path $SdkRoot "Sdks\Microsoft.NET.Sdk.WorkloadAutoImportPropsLocator\Sdk"
New-Item -ItemType Directory -Force $Locator | Out-Null

# 2) 放一个“空实现”的 AutoImport.props(MSBuild 只要找到这个文件就不再报缺失)
@'
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- no-op placeholder to satisfy Import Project="AutoImport.props" Sdk="Microsoft.NET.SDK.WorkloadAutoImportPropsLocator" -->
  <PropertyGroup />
</Project>
'@ | Out-File -Encoding utf8 -NoNewline (Join-Path $Locator "AutoImport.props")

# 3) 可选:再放一个极简 Sdk.props(一些 MSBuild 版本在解析 Sdk= 时会顺带探测 Sdk.props)
@'
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- no-op -->
</Project>
'@ | Out-File -Encoding utf8 -NoNewline (Join-Path $Locator "Sdk.props")

# 4) 确认文件存在
Get-ChildItem $Locator

看到目录里有 AutoImport.props(和 Sdk.props)就行。


方法三: 用同一份 SDK 编译(避免“用到别的坏 SDK”)

  1. UE 根目录(例如 D:\Program Files\Epic Games\UE_5.6)放 global.json 锁版本(把版本号改成你 dotnet --list-sdks 看到的那一条,比如 8.0.316):
cd "D:\Program Files\Epic Games\UE_5.6"
@'
{
  "sdk": { "version": "8.0.316", "rollForward": "latestMinor" }
}
'@ | Out-File -Encoding ascii -NoNewline .\global.json

dotnet --version   # 这里应该回显 8.0.316

2. 清缓存 + 重新生成 + 编 UBT:

dotnet nuget locals all --clear
.\GenerateProjectFiles.bat -2022

# 用 VS 的 amd64 MSBuild,构建 UBT(路径按你本机 VS 改;如果 VSINSTALLDIR 为空,先打开一次 VS)
& "$env:VSINSTALLDIR\MSBuild\Current\Bin\amd64\MSBuild.exe" `
  "Engine\Source\Programs\UnrealBuildTool\UnrealBuildTool.csproj" `
  /restore /p:Configuration=Development

如果你偏好 Rider,重启 Rider 后直接 Build 即可(它会继承我们设置的环境变量和占位文件)。