错误LGHT0204:ICE57:组件“XXX”既具有每个用户数据,又具有可以是每个用户或每台计算机的关键路径。

6

什么是“错误 LGHT0204:ICE57:组件‘XXX’既有每个用户数据,又有可以是每个用户或每台机器的关键路径”的含义?
是否可能修复此错误?
无论如何,Wix会创建msi文件,并且可以安装应用程序。这是真正的错误还是警告?如果是警告,我可以忽略这个错误吗?还是应该进行纠正?
这是我的单一包作者安装的wxs文件:

<?xml version='1.0' encoding='windows-1252'?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
  <Product Name='Foobar 1.0' Id='GUID' UpgradeCode='GUID'
    Language='1033' Codepage='1252' Version='1.0.0' Manufacturer='Acme Ltd.'>

    <Package Id='*' Keywords='Installer' Description="Acme's Foobar 1.0 Installer"
      Comments='Foobar is a registered trademark of Acme Ltd.' Manufacturer='Acme Ltd.'
      InstallerVersion='100' Languages='1033' Compressed='yes' SummaryCodepage='1252' />

    <Property Id="ALLUSERS" Secure="yes" Value="2" />
    <Property Id="MSIINSTALLPERUSER" Secure="yes" Value="1" />
    <Property Id='ApplicationFolderName' Value="Acme" />
    <Property Id='WixAppFolder' Value="WixPerUserFolder" />

    <Media Id='1' Cabinet='Sample.cab' EmbedCab='yes' DiskPrompt="CD-ROM #1" />
    <Property Id='DiskPrompt' Value="Acme's Foobar 1.0 Installation [1]" />

    <Directory Id='TARGETDIR' Name='SourceDir'>
      <Directory Id='ProgramFilesFolder' Name='PFiles'>
        <Directory Id='Acme' Name='Acme'>
          <Directory Id='INSTALLDIR' Name='Foobar 1.0'>
          </Directory>
        </Directory>
      </Directory>

      <Directory Id="ProgramMenuFolder" Name="Programs">
        <Directory Id="ProgramMenuDir" Name="Foobar 1.0">
          <Component Id="ProgramMenuDir" Guid="GUID">
            <RemoveFolder Id='ProgramMenuDir' On='uninstall' />
            <RegistryValue Root='HKMU' Key='Software\[Manufacturer]\[ProductName]' Type='string' Value='' KeyPath='yes' />
          </Component>
        </Directory>
      </Directory>
    </Directory>

    <DirectoryRef Id="INSTALLDIR">
       <Component Id='MainExecutable' Guid='GUID'>
          <File Id='FoobarEXE' Name='FoobarAppl10.exe' DiskId='1' Source='FoobarAppl10.exe' >
             <Shortcut Id="startmenuFoobar10" Directory="ProgramMenuDir" Name="Foobar 1.0" WorkingDirectory='INSTALLDIR' Icon="Foobar10.exe" IconIndex="0" />
          </File>
          <RegistryKey Root="HKMU" Key="Software\[Manufacturer]\[ProductName]">
             <RegistryValue Name="FoobarEXE" Value="1" KeyPath="yes" Type="integer" />
          </RegistryKey>
       </Component>
    </DirectoryRef>

    <Feature Id='Complete' Title='Foobar 1.0' Description='The complete package.'
      Display='expand' Level='1' ConfigurableDirectory='INSTALLDIR'>
      <Feature Id='MainProgram' Title='Program' Description='The main executable.' Level='1'>
        <ComponentRef Id='MainExecutable' />
        <ComponentRef Id='ProgramMenuDir' />
      </Feature>
    </Feature>

    <Icon Id="Foobar10.exe" SourceFile="FoobarAppl10.exe" />

  </Product>
</Wix>
2个回答

3
ICE57检查的意图是验证组件没有混合使用每个用户和每台机器文件和/或注册表设置。然而,Rob Mensching在http://sourceforge.net/p/wix/mailman/message/26687047/中的评论表明ICE57检查并不完美:
“我IRC,这是ICE57中的一个错误。 Windows Installer团队在评估这些值时没有考虑ALLUSERS属性……那是很久以前的事情了,所以我的记忆可能有点衰退。”
您的示例在单一软件包作者规则方面看起来是正确的。两个主要的目标目录是ProgramFilesFolder和ProgramMenuFolder,两者都针对每个用户的安装进行了适当的重定向。注册表键根为HKMU,在每台机器的安装中最终变成HKLM,在每个用户的安装中变成HKCU。
这看起来像是ICE57中的一个漏洞。遗憾的是我们无法访问ICE57源代码,因此难以直接修复。有几个解决问题的选项:
选项1-抑制ICE57

这不是最理想的方法,因为它会抑制该组的所有四个规则,而不仅仅是失败的规则。

选项2-使用广告快捷方式

将您的快捷方式更改为广告方式,并删除关联的注册表键。 MainExecutable 组件简化为:

   <Component Id='MainExecutable' Guid='GUID'>
      <File Id='FoobarEXE' Name='FoobarAppl10.exe' DiskId='1'
            Source='FoobarAppl10.exe' KeyPath='yes'>
         <Shortcut Id="startmenuFoobar10" 
                   Directory="ProgramMenuDir" 
                   Name="Foobar 1.0" 
                   WorkingDirectory='INSTALLDIR' 
                   Icon="Foobar10.exe" 
                   IconIndex="0" 
                   Advertise='yes'/>
      </File>
   </Component>

广告的短路似乎使ICE57检查更可靠。

关于ICE检查的说明

所有ICE检查都存储在文件darice.cub中。这实际上是一个Windows Installer数据库文件,您可以使用Orca打开。在典型的WIX安装中,此文件可以在以下位置找到:C:\Program Files (x86)\WiX Toolset vX.Y\bin。如果在Orca中打开darice.cub,则可以将ICE检查视为自定义操作。大多数引用了文件中嵌入的一个或多个二进制DLL。少数是以VBS实现的。


1
这不是一个错误。MSI文件中ALLUSERS的静态值是无关紧要的,因为许多安装在运行时在用户级别和计算机级别之间切换。测试本身是静态的,并且警告适用于计算机级别的安装。 - PhilDW
2
@PhilDW 谢谢,我已经阅读了你在回答中提到的所有帖子。但我仍然不明白我的示例有什么问题。如果这不是一个错误,那么我的示例就是错的吗?如果我的示例是错误的 - 如何修复它? - Volodymyr Bezuglyy
我想提一下,我也遇到了ICE57错误,并且我已经按照wixtoolset.org上的Wix教程做了几乎所有的事情。链接器生成了MSI文件,但是却抱怨ICE57错误。我不认为在这里广告快捷方式应该是解决方案,因为据我所知,它们是一个不太相关的功能。 - Armen Michaeli
我在Package中使用了Scope="perMachine",我期望得到的是perMachine的行为,而不是切换到perUser模式。 - undefined

2
这个问题已经被问了几十次。请不要贴出所有链接,而是在SO上搜索ICE57并参考解释和答案。例如这个: (WiX) Program files shortcut for per-machine install 还有这个: How to fix ICE57.Per-User installation 简短回答:如果您始终安装为每个用户,则忽略它;如果您安装为每个系统,则修复它。这是对MSI文件的静态测试,无法知道最终安装的上下文,因此会发出警告。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接