为什么在每台计算机上安装的非广告快捷方式会出现ICE57错误?

bra*_*drg 5 windows-installer wix msiexec

这个问题问的是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>
Run Code Online (Sandbox Code Playgroud)

如果将以上示例构建到MSI程序包中,则会出现此内部一致性评估器(ICE)错误:

D:\ Robert \ Documents \ Visual Studio 2013 \ Projects \ ShortcutTest \ Product.wxs(27,0):错误LGHT0204:ICE57:组件'ShortCut'既具有每个用户的数据,又可以是每个用户或每台机器。

ICE57暗示每位用户数据与每台机器数据之间的不一致。但是,组件的关键路径是HKMU,在每台计算机安装中,该路径解析为HKLM(HKEY_LOCAL_MACHINE)。快捷方式的位置源自“ ProgramMenuFolder”,在每台计算机上的安装路径解析为C:\ProgramData\Microsoft\Windows\Start Menu\(在Windows 8.1上)。该组件的资源似乎都没有与每个用户的关联。

您可以通过取消ICE57将安装程序包构建到MSI中。生成的MSI软件包安装时没有任何明显的错误。多个用户可以登录并访问快捷方式。任何用户都可以卸载该软件包,并且软件包中的所有资源都将被删除。

Wix为所有用户/每台计算机创建非广告的快捷方式的答案有一个有趣的解决方法,即编写广告的快捷方式,然后关闭广告。似乎是关于创建未发布的快捷方式的方式。

ICE57错误的常见解决方法是将<RegistryValue...>根目录更改为HKCU(HKEY_CURRENT_USER)。但是,这将创建一个安装程序,该安装程序在卸载时会留下用户注册表项。例如,如果用户A安装了软件包,则将注册表项添加到用户A的注册表配置单元中。如果用户B删除了程序包,则不会从用户A的注册表配置单元中删除注册表项。

在这种情况下,ICE57错误是否是内部一致性评估程序中的错误?还是我错过了一些事情?

Mar*_*los 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>
Run Code Online (Sandbox Code Playgroud)