Azure DevOps管道运行生成任务时出现System.Security.Cryptography相关错误
DevOps Server 2020 流水线构建UWP .NET Native编译失败解决方案
问题现象
DevOps Server 2020 配置的UWP构建流水线,执行MSBuild步骤时.NET Native编译环节报错,使用完全相同的构建参数在构建机本地命令行手动执行MSBuild可以正常构建,错误输出如下:
##[error]C:\Program Files (x86)\Microsoft SDKs\UWPNuGetPackages\microsoft.net.native.compiler\2.2.11-rel-30601-02\tools\Microsoft.NetNative.targets(805,5): Error : Type 'System.Security.Cryptography.Pkcs.SignedCms' from assembly 'System.Security.Cryptography.Pkcs' was not included in compilation, but was referenced in method 'Signature.GetContentPackage(SignedCms, X509IncludeOption)'. There may have been a missing assembly, or a dependency on a more recent Windows SDK release. ##[error]C:\Program Files (x86)\Microsoft SDKs\UWPNuGetPackages\microsoft.net.native.compiler\2.2.11-rel-30601-02\tools\Microsoft.NetNative.targets(805,5): Error : Type 'System.Security.Cryptography.Pkcs.SignerInfo' from assembly 'System.Security.Cryptography.Pkcs' was not included in compilation, but was referenced in method 'Pkcs7.ValidateOverride(SignatureDataProperties, SignatureValidationProperties)'. There may have been a missing assembly, or a dependency on a more recent Windows SDK release. ##[error]C:\Program Files (x86)\Microsoft SDKs\UWPNuGetPackages\microsoft.net.native.compiler\2.2.11-rel-30601-02\tools\Microsoft.NetNative.targets(805,5): Error : ILT0005: 'C:\Program Files (x86)\Microsoft SDKs\UWPNuGetPackages\runtime.win10-x64.microsoft.net.native.compiler\2.2.11-rel-30601-02\tools\x64\ilc\Tools\nutc_driver.exe @"O:\Agent1\_work\211\s\MyApp\MyApp.UWP\obj\x64\Release\ilc\intermediate\MDIL\MyApp.UWP.rsp"' returned exit code 1
核心排查方向
- 构建代理运行身份差异:本地手动执行MSBuild使用当前登录用户身份,DevOps代理默认以本地系统服务身份运行,两者的文件访问权限、用户配置加载、环境变量、NuGet包缓存权限完全不同,是这类「手动构建正常、流水线构建失败」问题的最高发诱因
- NuGet还原异常:流水线执行NuGet还原时未完整拉取
System.Security.Cryptography.Pkcs的UWP适配版本,或者命中了损坏的本地NuGet缓存 - 增量编译缓存脏数据:流水线工作目录留存的历史obj/bin文件未清理,和现有依赖产生版本冲突
- SDK环境加载不全:服务模式启动的代理未加载完整的Windows SDK、UWP开发工具路径,导致.NET Native编译时找不到对应程序集
解决步骤
按优先级从高到低操作,每步完成后重跑流水线验证:
- 修改构建代理运行账号
打开构建机服务管理器,找到对应DevOps代理服务(命名格式一般为Azure Pipelines Agent (你的代理池名.代理名)),右键进入「属性-登录」页,将运行身份改为你本地手动执行MSBuild时使用的、具备本地管理员权限的账号,重启代理服务后重跑构建。这一步能解决绝大多数同参数构建结果不一致的问题。 - 强制全量清理+无缓存还原
在流水线MSBuild步骤前新增两个命令行步骤:- 第一步清理所有历史构建目录:
if exist $(Build.SourcesDirectory) rd /s /q $(Build.SourcesDirectory) if exist $(Build.BinariesDirectory) rd /s /q $(Build.BinariesDirectory)- 第二步执行无缓存NuGet全量还原:
nuget restore $(Build.SourcesDirectory)\你的解决方案文件名.sln -NoCache - 显式补全依赖
在UWP项目中手动通过NuGet安装System.Security.Cryptography.Pkcs包,版本和当前使用的.NET Native Compiler版本适配,不要依赖其他包的传递引入;同时确认构建机安装的Windows SDK版本和UWP项目配置的目标SDK版本完全一致。 - 临时验证方案(不推荐生产使用)
如果需要快速出内部测试包,可以临时在UWP项目Release配置中关闭「使用.NET Native工具链编译」选项,跳过ILC编译环节。注意上架Microsoft Store的正式包必须开启.NET Native编译,该方案仅作临时验证用。
不要直接修改Microsoft.NetNative.targets文件内容,这类文件属于SDK/NuGet包自带文件,后续SDK更新、包还原时会被覆盖,无法作为长期解决方案。
内容的提问来源于stack exchange,提问作者cnavarro86
相关产品推荐
相关产品推荐

