Ошибка LGHT0204: ICE57: компонент "XXX" содержит данные как для каждого пользователя, так и путь к ключу, который может быть как для пользователя, так и для компьютера

Что означает ошибка "ошибка LGHT0204: ICE57: Компонент" XXX "имеет как данные для каждого пользователя, так и путь ключа, который может быть как для пользователя, так и для компьютера"?
Можно ли исправить эту ошибку?
В любом случае Wix создает MSI-файл и можно установить приложение. Это настоящая ошибка или просто предупреждение? Могу ли я игнорировать эту ошибку в случае, если это предупреждение? Или что-то должно быть исправлено?
Это файл wxs для моей установки Single Package Authoring:

<?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 ответа

Целью проверок ICE57 является проверка того, что компоненты не смешивают файлы для каждого пользователя и компьютера и / или параметры реестра. Однако комментарий Роба Меншинга в http://sourceforge.net/p/wix/mailman/message/26687047/ указывает, что проверки ICE57 не совершенны:

IIRC, это ошибка в ICE57. Команда установщика Windows не проверяла свойство 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, который вы можете открыть с помощью Orca. В типичной установке WIX этот файл можно найти в: C:\Program Files (x86)\WiX Toolset vX.Y\bin, Если вы откроете darice.cub в Orca, вы увидите чеки ICE как пользовательские действия. Большинство ссылаются на одну или несколько двоичных DLL, встроенных в файл. Некоторые из них реализованы как VBS.

Этот вопрос задавался десятки раз. Вместо публикации всех ссылок, пожалуйста, найдите ICE57 в SO и обратитесь к объяснениям и ответам. Например это:

(WiX) Ярлыки программных файлов для установки на машину

и это:

Как исправить установку ICE57.Per-User

Краткий ответ: игнорируйте его, если вы всегда устанавливаете для каждого пользователя, и исправляйте, если вы устанавливаете для каждой системы. Это статический тест для файла MSI, и он не может знать, в каком контексте будет установлена ​​установка, поэтому в любом случае выдает предупреждение.

Другие вопросы по тегам