UWP原生工具链构建偶发ILC1300内存访问错误的解决咨询
我们开发基于Xamarin.Forms的UWP应用,启用原生工具链构建以追求最佳性能并提交至Windows Store,目标平台覆盖x86|x64|ARM,使用的MSBuild编译脚本如下:
msbuild.exe OUR.UWP.csproj /nologo /nr:false ` /property:projectname="Our-Project" ` /p:AppxBundlePlatforms="x86|x64|arm" ` /p:Platform="x64" ` /p:AppxPackageDir="AppxPackages_Staging" ` /p:AppxBundle=Always ` /p:UapAppxPackageBuildMode="StoreUpload" ` /p:PackageCertificateThumbprint="***" ` /p:PackageCertificateKeyFile="***.pfx" ` /p:PackageCertificatePassword="***" ` /p:Verbosity=detailed ` /p:configuration="Release" /m
在Azure Pipelines结合Azure虚拟机规模集的构建环境中,频繁遭遇以下ILC1300错误:
LOGGERBASEDEXECTASK : ILC error ILC1300: Error while copying file 'C:\a\1\s**.UWP\obj\x86\Release\ilc\in\Microsoft.Graphics.Canvas.winmd' to 'C:\a\1\s\QQPad.Mobile\QQPad.Mobile.UWP\bin\x64\Release\x86\ilc\Microsoft.Graphics.Canvas.winmd': Invalid access to memory location : 'C:\a\1\s**.UWP\bin\x64\Release\x86\ilc\Microsoft.Graphics.Canvas.winmd' [C:\a\1\s**.UWP**.UWP.csproj]
原16核/64GB虚拟机几乎每次构建失败,切换到8核/32GB后仍偶发,40分钟的构建时长导致偶发失败严重拖慢发布效率,以下是针对性解决办法:
1. 限制MSBuild并行构建数
原生工具链中的32位ILC工具存在4GB内存上限,过多并行进程会触发内存溢出。修改MSBuild命令,通过/m:参数明确指定并行数,建议设为4或更低,平衡速度与稳定性:
msbuild.exe OUR.UWP.csproj /nologo /nr:false ` /property:projectname="Our-Project" ` /p:AppxBundlePlatforms="x86|x64|arm" ` /p:Platform="x64" ` /p:AppxPackageDir="AppxPackages_Staging" ` /p:AppxBundle=Always ` /p:UapAppxPackageBuildMode="StoreUpload" ` /p:PackageCertificateThumbprint="***" ` /p:PackageCertificateKeyFile="***.pfx" ` /p:PackageCertificatePassword="***" ` /p:Verbosity=detailed ` /p:configuration="Release" /m:4
2. 拆分多平台构建为独立任务
一次性构建三个平台会同时启动多个ILC进程,内存压力陡增。在Azure Pipelines中拆分任务:
- 任务1:单独构建x86平台
- 任务2:单独构建x64平台
- 任务3:单独构建ARM平台
- 最后执行打包合并操作
单平台构建的MSBuild示例(以x86为例):
msbuild.exe OUR.UWP.csproj /nologo /nr:false ` /p:projectname="Our-Project" ` /p:AppxBundlePlatforms="x86" ` /p:Platform="x86" ` /p:AppxPackageDir="AppxPackages_Staging/x86" ` /p:AppxBundle=Never ` /p:UapAppxPackageBuildMode="StoreUpload" ` /p:PackageCertificateThumbprint="***" ` /p:PackageCertificateKeyFile="***.pfx" ` /p:PackageCertificatePassword="***" ` /p:Verbosity=detailed ` /p:configuration="Release" /m:4
3. 给32位ILC工具启用大地址感知
在64位系统中,通过editbin.exe给32位的ilc.exe启用大地址感知,使其可使用超过4GB内存:
- 定位ILC工具路径(通常为
C:\Program Files (x86)\Microsoft Visual Studio\2022\Enterprise\MSBuild\Microsoft\VisualStudio\v17.0\Ilc) - 执行命令(需管理员权限):
editbin.exe /LARGEADDRESSAWARE "C:\Program Files (x86)\Microsoft Visual Studio\2022\Enterprise\MSBuild\Microsoft\VisualStudio\v17.0\Ilc\ilc.exe"
可将此步骤加入Azure Pipelines构建前的脚本环节,确保每次构建前生效。
4. 更新Visual Studio与工具链
微软持续修复ILC工具的内存管理问题,确保构建代理使用最新版本的Visual Studio 2022补丁,优化32位ILC进程的内存占用逻辑。
5. 清理构建缓存
偶发的文件访问错误可能源于缓存损坏,在构建脚本开头添加清理步骤:
msbuild.exe OUR.UWP.csproj /t:Clean /p:configuration="Release"
或直接删除obj和bin目录,避免旧文件干扰新构建的文件复制操作。
内容的提问来源于stack exchange,提问作者kyurkchyan

