这个问题是询问其中一个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包中,则会出现此Internal Consistency Evaluator (ICE)错误:
D:\ Robert \ Documents \ Visual Studio 2013 \ Projects \ ShortcutTest \ Product.wxs(27,0):错误LGHT0204:ICE57:组件&#39; ShortCut&#39;拥有每用户数据和一个可以是每用户或每台机器的密钥路径。
ICE57表示每用户和每台机器数据之间存在不一致。但是,组件的关键路径是HKMU,它在每台机器安装中解析为HKLM(HKEY_LOCAL_MACHINE)。快捷方式的位置来自&#39; ProgramMenuFolder&#39;,它在每台计算机的安装中解析为C:\ProgramData\Microsoft\Windows\Start Menu\
(在Windows 8.1上)。组件的所有资源似乎都没有任何每用户关联。
您可以通过抑制ICE57将安装程序包构建到MSI中。生成的MSI软件包安装时没有任何明显错误。多个用户可以登录并访问快捷方式。任何用户都可以卸载软件包,并删除软件包中的所有资源。
Wix create non advertised shortcut for all users / per machine的答案有一个有趣的解决方法,即制作广告快捷方式,然后关闭广告。似乎是关于创建未公布的快捷方式的一种方式。
ICE57错误的常见修复是将<RegistryValue...>
根更改为HKCU(HKEY_CURRENT_USER)。但是,这会创建一个安装程序,可以在卸载时留下用户注册表项。例如,如果用户A安装了包,则会将注册表项添加到用户A的注册表配置单元中。如果用户B删除了包,则不会从用户A的注册表配置单元中删除该注册表项。
在这种情况下,ICE57错误是内部一致性评估器中的错误?或者有什么我想念的东西?
答案 0 :(得分:2)
在研究另一个问题时,我在Rob Mensching的http://sourceforge.net/p/wix/mailman/message/26687047/发现了这条评论:
IIRC,这是ICE57中的一个错误。 Windows Installer团队没有看 评估这些价值时的ALLUSERS属性......这是很久以前的事了 虽然如此,我的记忆可能已经衰退了一点。
它看起来像是ICE57中的一个错误。
答案 1 :(得分:0)
将您的快捷方式移动到文件的子级并添加Adversite="yes"
属性。 RegistryValue
应该可以将快捷方式从perUser转换为perMachine。
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="MyApp" />
</Directory>
<Directory Id="ProgramMenuFolder" Name="Programs">
<Directory Id="ApplicationProgramsFolder" Name="My App Name" />
</Directory>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Id="ComponentGroup_Core">
<Component Id="Component_App" Guid="INSERT_GUID_HERE" Directory="INSTALLFOLDER">
<RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[AppName]"
Name="AppInstalled" Type="string" Value="yes" KeyPath="yes"/>
<File Id="MyApp" Name="My Test App.txt">
<Shortcut Id="Shortcut"
Name="Open Text File"
Description="Opens a text file"
Directory="ApplicationProgramsFolder"
WorkingDirectory="INSTALLFOLDER" />
</File>
</Component>
<Component Id="Component_MenuFolder" Guid="INSERT_GUID_HERE"
Directory="ApplicationProgramsFolder">
<RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[AppName]"
Name="MenuFolderInstalled" Type="string" Value="yes"
KeyPath="yes"/>
<RemoveFolder Id="RemoveFolder_App" On="uninstall" />
</Component>
</ComponentGroup>
</Fragment>