Unreal Engine 4.26 构建崩溃:C#报访问受保护系统路径权限拒绝
核心故障定位
从构建日志的调用栈可以直接锁定问题触发链路:
- 崩溃发生在UnrealBuildTool(UBT)执行运行时依赖匹配阶段:这步逻辑会递归遍历指定目录下的所有文件,匹配需要随Editor加载的运行时依赖项
- 递归遍历逻辑没有做路径边界兜底,直接无限制向上遍历到了D盘最顶层根目录,先后碰到
D:\$RECYCLE.BIN(回收站元数据目录)、后续的D:\System Volume Information(系统还原点元数据目录)。这两个目录是Windows默认加了最高权限保护的隐藏目录,哪怕用户以管理员身份运行程序,非SYSTEM身份访问都会被系统直接拦截,抛出拒绝访问异常 - 之前清空回收站能临时解决问题的原因:清空回收站会暂时删掉
$RECYCLE.BIN下的S-1-5-18系统账户子目录,UBT扫到这层时没有遇到拦截点,就会继续往下遍历,直到碰到下一个无权限目录System Volume Information才再次报错,完全匹配“清完问题暂时缓解、很快复发”的现象 - 为什么迁移纯资源项目就正常、一拷C代码就崩溃:纯资源空项目没有携带C项目的
Target.cs配置文件,也就不存在错误的路径扫描规则,UBT不会跑到项目目录范围外扫文件,自然不会触发崩溃。
仅在同事设备复现的原因
- 项目里的依赖扫描路径是基于Git仓库内的相对路径硬编码的:你本地的项目嵌套层级和路径配置是匹配的,相对路径往上跳几级刚好停在项目或引擎的子目录范围内,不会触达磁盘根目录
- 同事把Git拉取的仓库直接放在了D盘根目录下,或者项目嵌套层级和你本地不一致:同样的相对路径配置,在他的设备上顺着往上递归扫描时,直接触达了D盘的最顶层根目录,自然会撞上系统保护文件夹
- 同事安装的新版SDK配套的UBT逻辑,没有对“无权限访问目录”做兜底跳过处理:你本地用的旧版SDK,UBT碰到访问被拒绝的目录会自动跳过继续执行,不会抛出未处理异常导致整个构建流程崩溃,这也对应了你们俩唯一的环境差异——他的SDK比你的版本新数周。
可直接落地的修复步骤
- 先把项目从磁盘根目录挪到层级足够深的子路径下,比如统一放到
D:\Dev\UnrealProjects\Naptin,绝对不要直接把.uproject文件丢在磁盘盘符根目录 - 全量删除项目目录下的
Intermediate、Binaries、DerivedDataCache三个缓存文件夹,清除之前残留的错误路径配置生成的临时文件 - 打开项目下所有
*.Target.cs文件,检查里面的RuntimeDependencies配置项:确保所有扫描路径都是基于项目根目录拼接的相对路径,不存在从盘符根目录开始的绝对路径、或者往上跳太多层的../../类递归路径 - 给UBT启动加兜底参数:在生成VS项目、执行构建的时候,给UnrealBuildTool的启动命令加上
-IgnoreMissingFiles,让它碰到无权限访问的目录直接跳过,不抛出未处理异常中断流程 - 之前做的开开发者模式、取消文件只读属性这些操作可以保留,不需要额外折腾系统权限——本质不是权限不够,是UBT越界跑到系统保护目录里扫文件了。
内容的提问来源于stack exchange,提问作者Mahboi
相关产品推荐
相关产品推荐

