为何WiX报ICE64错误提示dirStartMenuFolder未列入RemoveFile表?
报错原因
ICE64是Windows Installer的内置验证规则,用于检测用户配置文件路径下的目录是否会在卸载时残留。你虽然已经添加了<RemoveFolder>配置,但触发报错通常是以下两个原因:
<RemoveFolder>默认仅能删除空目录,规则判定该目录卸载时可能存在其他遗留文件,无法保证被成功移除- 你的当前组件KeyPath为HKCU路径,如果安装包配置为每台机器级安装,会出现组件作用域和目录作用域不匹配的问题,验证规则无法确认卸载时
<RemoveFolder>一定会执行
解决方法
方案1(推荐,适配所有场景)
在你现有的cMyShortcut组件中新增<RemoveFile>配置,卸载时先清空目录下所有内容,再删除目录即可通过验证,修改后的组件代码如下:
<Component Id="cMyShortcut" Guid="my-guid"> <Shortcut Id="shMyShortcut" Name="MyApp" Description="My Great App" Target="[#fMyApp]" WorkingDirectory="dirIniFolder" /> <!-- 新增以下行,清空目录下所有文件 --> <RemoveFile Id="rmStartMenuAllFiles" Name="*.*" On="uninstall" /> <RegistryValue Root="HKCU" Key="Software\$(var.Manufacturer)\$(var.ProductName)" Name="InstalledMyShortcut" Type="integer" Value="1" KeyPath="yes" /> <RemoveFolder Id="rmStartMenuFolder" Directory="dirStartMenuFolder" On="uninstall" /> </Component>
如果你的安装包是每台机器级安装(即ALLUSERS=1),请将<RegistryValue>的Root属性修改为HKLM,保证组件作用域匹配。
方案2(临时跳过验证,不推荐生产环境使用)
如果确认目录不会有残留,你可以在Light.exe的编译参数中添加-swice64,直接屏蔽ICE64验证规则即可消除报错。
内容的提问来源于stack exchange,提问作者Tim Long
相关产品推荐
相关产品推荐

