此问题询问 ICE57 验证器之一是否会创建误报错误报告。
我正在使用 WIX 3.9 生成安装程序。我想要使用非广告快捷方式的每台计算机安装。
此 WXS 示例安装一个文本文件和打开该文本文件的快捷方式:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="ShortcutTest" Language="1033"
Version="1.0.0.0" Manufacturer="Widget Co"
UpgradeCode="--YOUR GUID1--">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate EmbedCab="yes"/>
<Feature Id="ProductFeature" Title="ShortcutTest" Level="1">
<ComponentRef Id="TextFile" />
<ComponentRef Id="ShortCut" />
</Feature>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="ShortcutTest">
<Component Id="TextFile" Guid="--YOUR GUID2--">
<File Id="File" Name="TextFile.txt" Source="TextFile.txt" KeyPath="yes"/>
</Component>
</Directory>
</Directory>
<Directory Id="ProgramMenuFolder">
<Directory Id="ApplicationProgramsFolder" Name="Shortcut Test">
<Component Id="ShortCut" Guid="--YOUR GUID3--">
<RegistryValue Root="HKMU" Key="Software\WidgetCo\ReadMeTextFile\TextFile" Name="Installed" Type="string" Value="yes" KeyPath="yes"/>
<Shortcut Id="Shortcut"
Name="Open Text File"
Description="Opens a text file"
Target="[INSTALLFOLDER]TextFile.txt"
WorkingDirectory="INSTALLFOLDER"/>
<RemoveFolder Id="ApplicationProgramsFolder" Directory="ApplicationProgramsFolder" On="uninstall"/>
</Component>
</Directory>
</Directory>
</Directory>
</Product>
</Wix>
如果将上面的示例构建到 MSI 包中,您将得到以下内容内部一致性评估器(ICE) https://msdn.microsoft.com/en-us/library/aa369554(v=vs.85).aspx error:
D:\Robert\Documents\Visual Studio 2013\Projects\ShortcutTest\Product.wxs(27,0): 错误 LGHT0204: ICE57: 组件“ShortCut”同时具有每用户数据和密钥路径,可以是每用户或每台机器。
ICE57 https://msdn.microsoft.com/en-us/library/aa368994(v=vs.85).aspx意味着每用户数据和每台机器数据之间存在不一致。但是,该组件的关键路径是 HKMU,在每台计算机安装中解析为 HKLM (HKEY_LOCAL_MACHINE)。快捷方式的位置源自“ProgramMenuFolder”,在每台计算机安装中解析为C:\ProgramData\Microsoft\Windows\Start Menu\
(在 Windows 8.1 上)。该组件的所有资源似乎都没有任何每用户关联。
您可以通过抑制 ICE57 将安装程序包构建到 MSI 中。生成的 MSI 包安装后没有任何明显错误。多个用户可以登录并访问该快捷方式。任何用户都可以卸载该软件包,并且该软件包中的所有资源都将被删除。
答案是Wix 为所有用户/每台机器创建非广告快捷方式 https://stackoverflow.com/questions/2058230/wix-create-non-advertised-shortcut-for-all-users-per-machine有一个有趣的解决方法,即编写广告快捷方式,然后关闭广告。似乎是创建不公开的快捷方式的一种迂回方式。
ICE57 错误的常见修复方法是更改<RegistryValue...>
根目录到 HKCU (HKEY_CURRENT_USER)。然而,这会创建一个安装程序,在卸载时可能会留下用户注册表项。例如,如果用户 A 安装该软件包,则会将注册表项添加到用户 A 的注册表配置单元中。如果用户 B 删除该程序包,则注册表项不会从用户 A 的注册表配置单元中删除。
在这种情况下,ICE57 错误是内部一致性评估器中的错误吗?还是我有什么误解?