如何避免WixToolset中用户AppDir文件夹的LGHT0204(ICE64)报错?
解决WiX ICE64错误:保留主应用创建的用户目录
当你在WiX中引用主应用已创建的用户目录(如ProgAppDataDir和ScriptsDir),但不想在卸载时删除它们时,ICE64会因为这些目录在用户配置文件下却未被列入RemoveFile表而报错。以下是几种可行的解决方案:
1. 直接抑制ICE64检查
ICE64是WiX的验证规则,用于确保用户配置文件中的目录在卸载时被清理,但这些目录并非你的安装程序创建,完全可以跳过该检查:
- 命令行编译时,给
light.exe添加参数:light.exe YourProject.wixobj -sice:ICE64 -out YourInstaller.msi - Visual Studio WiX项目中,右键项目→属性→Tool Settings→Light→Additional Options,输入
-sice:ICE64即可。
2. 标记目录为“非当前安装程序创建”
在WiX的目录结构定义中,给ProgAppDataDir和ScriptsDir添加NeverCreate="yes"属性,明确告知WiX这些目录不是由当前安装程序创建的,ICE64就不会触发检查:
<Directory Id="AppDataFolder"> <Directory Id="ProgAppDataDir" Name="ProgApp" NeverCreate="yes"> <Directory Id="ScriptsDir" Name="Scripts" NeverCreate="yes"> <Directory Id="SCRIPTINSTALLDIR" Name="MyScriptExtension" /> </Directory> </Directory> </Directory>
这种方式最贴合实际场景,是推荐的解决方案。
3. 添加空的“占位”组件通过检查
如果不想修改目录属性或抑制ICE,可以创建一个永远不会被安装的组件,添加空的RemoveFile条目来满足ICE64的要求,但不会实际删除任何内容:
<Component Id="DummyICE64Fix" Guid="PUT-YOUR-GUID-HERE" Directory="ScriptsDir"> <RemoveFile Id="DummyRemoveProgApp" Directory="ProgAppDataDir" Name="*" On="uninstall" /> <RemoveFile Id="DummyRemoveScripts" Directory="ScriptsDir" Name="*" On="uninstall" /> <!-- 让组件永远不安装,避免执行RemoveFile --> <Condition>0</Condition> </Component>
这个组件因为Condition为0,永远不会被部署,所以RemoveFile不会生效,仅用于通过ICE64的验证。
内容的提问来源于stack exchange,提问作者sluke_nuix
相关产品推荐
相关产品推荐

