我们的应用程序在运行时将一些设置写入注册表到HKCU配置单元。我想在卸载期间删除此设置。这是代码:
<Fragment>
<DirectoryRef Id="INSTALLLOCATION" DiskId="1" FileSource="$(var.SourceDirProject)\">
<Component Id="DeleteHkcuManufacturerHive" Guid="GUID">
<Condition>REMOVE="ALL" AND NOT UPGRADINGPRODUCTCODE</Condition>
<CreateFolder/>
<RemoveRegistryKey Action="removeOnUninstall"
Id="HKCUkey" Root="HKCU" Key="Software\$(var.Manufacturer)"/>
</Component>
</DirectoryRef>
</Fragment>
ICE57:组件'DeleteHkcuManufacturerHive'包含每台用户和每台机器的数据以及每台机器的KeyPath。
为什么我得到ICE57?安装是按用户进行的。提前致谢。
UPD:每台机器元素在哪里?可能是INSTALLLOCATION = Program Files \ ManufacturerDirectory?
答案 0 :(得分:7)
您正在使用仅适用于当前用户的HKCU配置单元。
MSDN州:
ICE57验证单个组件不会混合每台机器和 每用户数据。此ICE自定义操作检查注册表项,文件, 目录键路径和未公布的快捷方式。每个用户和 同一组件中的每台机器数据可能只会导致部分数据 为多用户中的某些用户安装组件 环境。
ICE是您的安装包的验证。如上所述,ICE57旨在确保您不会混淆每台机器和每用户构造。如果您必须在卸载期间删除HKCU中的条目(并且每台计算机上安装了该软件),那么您可以在属性&gt;中的Visual Studio中关闭该特定验证。工具设置如下面的屏幕截图所示:
但是,您可能想要考虑问题的根本原因。如果您正在进行每台计算机的安装,那么您的安装程序或应用程序可能不应该写入HKCU,因为它仅供当前用户使用,而您的应用程序是为所有用户安装的。
答案 1 :(得分:3)
我在wix-users mailing list.得到了答案。这是 Peter Shirtcliffe 的回答:
ProgramFiles is a per-machine location. You can only access it when elevated.
If you want to install program code in a per-user installation, you should
install to %LocalAppData%\Programs.
Remove the condition entirely. The component will be installed but will have
no effect until you uninstall the application. At that point, when the
component is removed, the registrykey will be removed also.