PAYATHON 2026

.NET MAUI .NET 10 出现 NETSDK1005,如何排查目标框架缺失?

数据阿明

NETSDK1005 表示构建时读取的 project.assets.json 中缺少本次构建所需的目标。先确认报错文件属于哪个项目,再对照还原和构建时实际使用的目标框架、RuntimeIdentifier 和 assets 路径。

现有材料还不足以确定唯一根因。TargetFrameworks 已声明这些平台,反复删除缓存或安装 workloads 未必能解决问题,需要查明新生成的 assets 文件对应哪些还原输入。

先确认报错的是哪个项目

示例同时引用了主 MAUI 项目和 Orbis.Core.Domain.csproj。请保留错误中的完整 assets 路径,以及错误末尾可能出现的项目路径。

如果出错的是被引用项目,就检查该项目自己的目标框架和还原结果。普通类库的 assets 文件不一定包含主应用的全部平台 TFM,不能仅凭缺少这些目标就认定还原出错。

后续命令中的 YourApp.csproj 是占位名称,请替换为实际报错项目的路径,以免在解决方案目录执行命令时误查其他项目。

查看 MSBuild 实际评估出的属性

在项目目录中执行:

dotnet --info
dotnet --list-sdks
dotnet workload list
dotnet msbuild YourApp.csproj -getProperty:TargetFrameworks,TargetFramework,MSBuildProjectExtensionsPath,ProjectAssetsFile

核对以下内容:

  • 当前目录选中的 SDK 是否与预期一致,父目录中的 global.json 是否影响 SDK 选择。
  • TargetFrameworks 是否仍然包含 .csproj 中声明的平台。
  • MSBuildProjectExtensionsPath 和 ProjectAssetsFile 是否指向当前项目的预期位置。
  • 多个项目是否被配置为写入同一个 assets 文件。

多目标项目在外层评估时,TargetFramework 为空可能是正常现象。还需要针对出错平台检查内部评估结果:

dotnet msbuild YourApp.csproj -p:TargetFramework=net10.0-android -getProperty:TargetFramework,TargetFrameworks,TargetPlatformIdentifier,TargetPlatformVersion,RuntimeIdentifier,ProjectAssetsFile

如果评估值与项目文件不一致,继续检查 Directory.Build.props、Directory.Build.targets、其他导入文件和构建脚本中的属性设置,留意是否覆盖了 TargetFramework、TargetFrameworks、BaseIntermediateOutputPath、MSBuildProjectExtensionsPath 或 ProjectAssetsFile。

终端显示 10.0.201,只能说明那次终端调用选中了这个 SDK。如果 IDE 与命令行结果不同,还需要分别核对它们的构建环境。

用同一组参数还原和构建单个平台

在能够构建 Android 且已安装相应工具链的环境中,可以先限定 Android 目标,缩小排查范围:

dotnet restore YourApp.csproj -p:TargetFrameworks=net10.0-android --force --verbosity diagnostic > restore-android.log 2>&1

检查命令的退出状态和日志中的第一个错误。只有还原成功后,才使用相同的框架范围构建:

dotnet build YourApp.csproj -f net10.0-android -p:TargetFrameworks=net10.0-android --no-restore

这里同时限定 TargetFrameworks,是为了让还原和构建使用相同的单平台范围。这是诊断步骤,不意味着项目应该永久只保留 Android。

如果单平台成功,而完整多目标还原失败,就逐个平台恢复测试,定位是哪个平台或条件配置触发了问题。测试其他平台时,应满足对应的宿主环境和工具链要求。

iOS 配置中还显式设置了:

<RuntimeIdentifier>ios-arm64</RuntimeIdentifier>

还原与后续构建也要保持 RID 一致。若构建时改为模拟器 RID,应按该 RID 重新还原。缺少特定 TFM/RID 组合时也可能出现 NETSDK1047,需要结合完整错误区分。

检查 assets 的内容和归属

打开错误实际指向的 project.assets.json,查看:

  • project.restore.projectPath:是否属于当前项目。
  • project.frameworks:还原识别到了哪些框架。
  • targets:实际生成了哪些依赖解析目标。
  • 文件中的 targetAlias:与项目声明的 TFM 如何对应。

平台 TFM 在 assets 中可能采用补齐平台版本的形式,目标键也可能带有 /RID。因此,不能只因搜索不到完全相同的 net10.0-android 字符串,就判定 Android 目标不存在。

可以根据观察结果继续排查:

观察结果后续检查
文件属于其他项目检查 assets 路径覆盖及项目间输出目录冲突
框架列表与实际评估的 TargetFrameworks 不一致检查还原命令、属性覆盖,以及文件是否随后被其他操作重写
还原失败但留下了 assets 文件先修复还原日志中的第一个错误
目标存在,构建仍报缺失对照构建使用的完整 TFM、RID、平台版本和 assets 路径

project.assets.json 存在,并不等于这次还原已经成功完成。不要手动添加 targets 节点,依赖解析结果应由还原过程生成。

项目配置中有两处值得核对

Android 条件混用了两种 TFM

项目声明的是:

<TargetFrameworks>net10.0-maccatalyst;net10.0-ios;net10.0-android</TargetFrameworks>

但部分条件判断使用:

Condition="'$(TargetFramework)' == 'net10.0-android33.0'"

按展示的目标框架列表,这些条件通常不会匹配。因此,其中的 Xamarin.Google.UserMessagingPlatform、Twilio.Voice.Android.XamarinBinding 等引用可能没有进入对应的还原输入。

如果这些引用本来就应应用于当前 Android 目标,可以将相应条件统一为实际声明的 TFM,例如:

<ItemGroup Condition="'$(TargetFramework)' == 'net10.0-android'">
  <PackageReference Include="Xamarin.Google.UserMessagingPlatform" Version="2.0.0.2" />
</ItemGroup>

这只是条件一致性的修改示例,并不证明该包版本兼容当前项目。若确实需要显式指定 Android 平台版本,应同步核对目标框架声明、条件和工具链支持,不能只改其中一处。

SupportedOSPlatformVersion 表示最低支持的系统版本,用途不同于目标平台版本。现有材料不能证明必须把 net10.0-android 改成带版本的 TFM 才能解决 NETSDK1005。

Windows 目标受宿主系统条件控制

当前配置仅在 MSBuild 判断宿主为 Windows 时追加 Windows 目标:

<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net10.0-windows10.0.19041.0</TargetFrameworks>

在非 Windows 环境评估时,不包含该目标符合这段配置的含义。需要区分各平台错误是否来自不同环境,以及 IDE 或脚本是否额外传入了目标框架参数。

如果 restore 自身就报 NETSDK1005

正常还原需要先解析依赖。如果 dotnet restore 自身就在读取旧 assets 时失败,应进一步查看调用链,确认是否有自定义或导入的 target,在还原期间提前执行了依赖解析或构建任务。

可以采集 MSBuild 二进制日志:

dotnet msbuild YourApp.csproj -t:Restore -v:diag -bl:restore.binlog

查找首次抛出 NETSDK1005 的 task、所属项目、当时的属性值,以及它为什么在 Restore 过程中执行。dotnet clean 也可能经过会读取 assets 的目标,所以 clean 报错不能用来证明 restore 已经成功。

示例还包含 Swift 链接、原生库、签名和大量第三方包配置。仅凭这些配置,无法认定某个包或链接参数就是所有平台目标缺失的原因。若日志出现包兼容性、包源、workload 或 SDK 错误,应先处理那些具体错误,再重新还原。

若上述步骤仍无法定位问题,请提供完整错误路径、单平台还原日志中的第一个错误、MSBuild 属性评估结果,以及 assets 中的框架键名。这些信息有助于区分属性不一致、文件被覆盖、还原失败和构建读取了错误文件等情况。

备注:内容仅供参考。