如何解决C# workflow项目计划夜间构建时的XAML编译报错问题
"C:\NETSIU\backend\netasiu\workflows4\workflows4.integrazione.fatturapassiva\workflows4.integrazione.fatturapassiva.csproj"
(Build target) (689) -> (XamlMarkupCompilePass1 target) ->
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Xaml.targets(193,5):
error XC1000: XC1020: Build error occurred in the XAML MSBuild task:
'Could not load file or assembly
'file:///C:\NETSIU\Infra\Tipi.Workflow\bin\NETA.SUITE.Tipi.Workflow.dll'
or one of its dependencies. Access is denied.'
[C:\NETSIU\backend\netasiu\workflows4\workflows4.integrazione.fatturapassiva\workflows4.integrazione.fatturapassiva.csproj]
上述偶发访问拒绝错误的核心原因是多构建任务并发访问共享依赖程序集时的文件锁冲突,结合你提供的场景,具体诱因如下:
- 同时运行Debug、Release两个配置的全量构建,加上MSBuild默认开启多进程并行编译,XAML标记编译任务会以独占方式加载依赖程序集,多个构建任务同时访问同一个dll时就会触发访问拒绝。手动运行全量构建报错概率低是因为登录用户会话的文件系统缓存机制会降低锁冲突概率,而计划任务运行在无UI的会话0上下文,没有对应的缓存优化,冲突概率大幅提升。
- 你使用的MSBuild 14.0版本存在已知bug:XAML编译任务加载依赖程序集后不会主动释放文件句柄,进一步放大了锁冲突的概率。
- 构建目录的实时杀毒扫描也可能会在文件生成时占用句柄,加剧冲突。
优先级1:快速生效的流程调整
- 拆分Debug和Release构建任务,不要同时运行两个配置的全量构建,完成一个配置的全量构建后再启动另一个,从根源上消除跨配置的文件访问冲突。
- 在构建脚本中针对XC1020错误添加自动重试逻辑:XAML项目构建失败时自动重试2-3次,每次间隔2秒,即可解决偶发的锁冲突问题。MSBuild调用示例:
msbuild /p:Configuration=Release /p:RetryOnFailureFailures=XC1020 /p:RetryOnFailureMaxAttempts=3 /p:RetryOnFailureDelayMilliseconds=2000 workflows4.integrazione.fatturapassiva.csproj - 全量构建启动前先删除所有项目的bin、obj目录,避免上次构建残留的锁定文件影响本次构建。
优先级2:修复底层工具问题
- 升级MSBuild到16.0以上版本(对应Visual Studio 2019及以上版本的MSBuild),高版本已经修复了XAML编译任务句柄泄漏的bug,升级后不需要修改项目代码,保持原有目标框架即可正常构建。升级后替换构建脚本中的路径配置即可:
set path=C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin;%path% - 将整个构建目录
C:\NETSIU添加到Windows Defender的排除扫描列表,避免杀毒软件扫描时占用文件句柄。
优先级3:调整计划任务配置
- 计划任务勾选「不管用户是否登录都要运行」,确认运行账号为本地管理员组账号,同时勾选「使用最高权限运行」,消除权限上下文差异。
内容的提问来源于stack exchange,提问作者gitorrac

