使用Light.exe生成MSI时全组件报LGHT0204:ICE80错误求助
问题重现
使用Light.exe打包MSI时,所有组件触发如下错误:
C:\path\WXS.wxs(10) : error LGHT0204 : ICE80: This 32BitComponent [component name] uses 64BitDirectory [directory name]
已全局设置Platform='x64',且确认无32位组件,但问题仍存在。
解决方案
显式标记组件为64位:
即使全局设置了Platform='x64',个别组件可能未继承64位属性。确保每个<Component>标签添加Win64='yes',或在根<Wix>元素中全局默认:<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" Platform="x64"> <Product Id="*" Name="MyApp" Version="1.0.0" Language="1033" Manufacturer="MyCorp" UpgradeCode="PUT-GUID-HERE"> <Component Id="MainExe" Win64="yes" Directory="INSTALLFOLDER"> <File Source="MyApp.exe" /> </Component> </Product> </Wix>检查
Light.exe命令行参数:
确认打包时未传入错误的平台参数,正确命令应为:light.exe -out MyApp.msi -platform x64 MyApp.wixobj重新编译并清理缓存:
删除所有.wixobj和.wixpdb中间文件,用Candle.exe重新编译(指定x64)后再打包:candle.exe -platform x64 MyApp.wxs light.exe -out MyApp.msi MyApp.wixobj验证目录配置:
确保未手动指定32位系统目录(如C:\Program Files (x86)),而是使用WiX内置的ProgramFilesFolder(x64环境下自动指向64位目录)。避免目录定义中硬编码路径导致位数冲突。检查引用的WiX库:
若项目引用了外部.wixlib文件,确认这些库是针对x64编译的,且库内组件未硬编码32位属性。
错误原因说明
ICE80是Windows Installer的一致性检查规则,要求组件位数与所在目录位数严格匹配。全局Platform='x64'会让系统目录默认指向64位路径,但如果组件未显式标记为64位,WiX可能默认按32位处理,从而触发冲突。
内容的提问来源于stack exchange,提问作者vajnaivik

