NativeAOT 编译完却报 MSB3030:XML 文档还没复制到 bin
.NET 11 RC2 的优化 AOT 发布路径可能跳过常规 Build,XML 文档仍留在 obj。区分生成文档与发布文档,选择适合交付要求的绕行。
NativeAOT 已经完成本机编译,dotnet publish 最后却报 MSB3030:要复制的项目 XML 文档在 bin/Release/... 下不存在,实际文件还留在 obj/Release/...。如果启用了 GenerateDocumentationFile,并使用 .NET SDK 11.0.100-rc.2.26504.105,应检查优化 AOT 发布路径。
同一个最小项目在 RC1 可以发布,在 RC2 失败;它甚至可以只针对 net10.0,因此不要只看目标框架名称来推断使用的是 .NET 10 SDK。运行 SDK、目标框架与原生编译前提需要分别记录。
不需要交付 XML 文档时,只关闭它的发布
如果交付物不要求包含 XML 文档,可以在原发布命令中加入:
dotnet publish ./AotXmlRepro.csproj -c Release -r win-x64 -p:PublishDocumentationFile=false
项目名和 RID 是示例,应沿用实际项目、平台和原生构建前提。这个设置控制文档是否进入发布文件列表,不是关闭编译期 XML 文档生成;GenerateDocumentationFile 可以继续保留。先确认下游工具、包内容或交付规范并不依赖这份文档。
需要保留文档时,评估回到完整 Build 路径
RC2 的 NativeAOT 优化发布可以只执行编译相关目标,省去完整 Build。对于需要常规输出复制阶段的项目,可评估在原命令中改用:
dotnet publish ./AotXmlRepro.csproj -c Release -r win-x64 -p:UseOptimizedPublish=false
这恢复完整构建路径,可能产生更多托管中间输出并增加构建工作。它与“不发布 XML 文档”是两个备选处理,不需要为了保险机械叠加。修改前保留项目和发布参数,并确认最终交付目录只包含计划发布的文件。
不要手工复制一份旧 XML 到 bin 后反复重试。文档可能来自另一版程序集,残留文件也会掩盖干净构建仍失败的事实。清理时只处理可重建的本项目构建输出,保留日志和其他必要产物,不触碰已有正式部署目录。
验收用独立的干净发布输出,从原入口确认发布完成、原生可执行文件能正常运行;选择保留文档时,还要检查 XML 与本次程序集相符。后续 SDK 的处理应按对应发行版本重新核对,不能把 RC 间修正或目标框架不变当作正式稳定版的保证。


