为什么我们在每台机器安装中获得非广告快捷方式的ICE57错误?



这个问题是问是否有一个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="SoftwareWidgetCoReadMeTextFileTextFile" 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)错误:

D:RobertDocumentsVisual Studio 2013ProjectsShortcutTestProduct.wxs(27,0):错误LGHT0204: ICE57:组件'ShortCut'具有每个用户数据和可以是每个用户或每个机器的键盘。

ICE57表示每个用户和每个机器的数据不一致。但是,组件的关键路径是HKMU,在每台机器安装中解析为HKLM (HKEY_LOCAL_MACHINE)。快捷方式的位置来自'ProgramMenuFolder',在每台机器安装中解析为C:ProgramDataMicrosoftWindowsStart Menu(在Windows 8.1上)。组件的资源似乎没有任何与每个用户的关联。

您可以通过抑制ICE57将安装包构建到MSI中。由此产生的MSI包安装没有任何明显的错误。多个用户可以登录并访问该快捷方式。任何用户都可以卸载这个包,并且包中的所有资源都将被删除。

对于Wix为所有用户/每台机器创建非广告快捷方式的答案有一个有趣的解决方案,即编写广告快捷方式,然后关闭广告。这似乎是一种创造未被宣传的快捷方式的迂回方式。

对于ICE57错误的一个常见修复是将<RegistryValue...>根更改为HKCU (HKEY_CURRENT_USER)。但是,这会创建一个在卸载时可能会留下用户注册表项的安装程序。例如,如果用户A安装了包,注册表项将添加到用户A的注册表单元中。如果用户B删除了包,注册表项不会从用户A的注册表单元中删除。

在这种情况下,ICE57错误是内部一致性评估器中的错误吗?还是有什么我没理解的?

在研究另一个问题时,我发现了Rob Mensching在http://sourceforge.net/p/wix/mailman/message/26687047/上的评论:

IIRC,这是ICE57中的一个bug。Windows安装程序团队没有看到ALLUSERS属性在计算这些值时…那是很久以前的事了尽管如此,我的记忆可能已经衰退了一点。

好像是ICE57的bug

将快捷方式移动到File的子文件并添加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>

相关内容

  • 没有找到相关文章

最新更新