ICE38: Компонент устанавливается в профиль пользователя с ошибкой для определенного компонента

Я пытаюсь написать сценарий установщика Windows в WiX 3.6 с настройкой только для каждой машины и архитектуры x64. У меня есть следующая структура проекта (сокращенно):

<Directory Id="ProgramFiles64Folder" Name="PFiles">
    <Directory Id="APPLICATIONFOLDER" Name="My Company">
      <Directory Id="ProductFolder" Name="My Product">
        <Component Id="MainComponent" Guid="" Win64="yes" KeyPath="yes">
            ...
        </Component>
        <Directory Id="DataFolder" Name="Data">
          <Directory Id="Machine" Name="Machine" >
            <Directory Id="MachinesFolder" Name="Machines">
              <Component Id="Machine1" Guid="{74341536-72DF-48C3-95E8-2851D9FA8318}" Win64="yes" KeyPath="yes">
                        ...
              </Component>
            </Directory>
            <Directory Id="TemplateFolder" Name="Template">
              <Component Id="TemplateFiles" Guid="{A0D0C225-D604-4B84-971D-41687A30EC36}" Win64="yes" KeyPath="yes">
                <File Id="Template1.rsbak" Source="$(var.SolutionDir)bin\Release\File1.rsbak" />
                            ...
              </Component>
            </Directory>
          </Directory>
        </Directory>
      </Directory>
    </Directory>
</Directory>

Проблема в том, что я получаю ошибку ICE38: Component TemplateFiles installs to user profile. It must use a registry key under HKCU as its KeyPath, not a file для компонента TemplateFiles при компиляции. Что меня смущает, так это то, что я использую аналогичную структуру в другом проекте (рабочем) и имею несколько компонентов с точно такой же настройкой в ​​моем проекте (не показано выше). Почему этот - и только этот - компонент настаивает на установке в профиль пользователя, когда все остальные устанавливаются правильно, в Program Files?


person Torbjörn Bergstedt    schedule 12.10.2012    source источник


Ответы (1)


Похоже, что существует значительная разница для msi между папками Program Files и Users\UserName\Documents. Последний упоминается в вашем примере:

<Directory Id="DataFolder" Name="Data">

Я столкнулся с похожей проблемой и нашел ответ в сообщении блога - https://robmensching.com/blog/posts/2007/4/27/how-to-create-an-uninstall-shortcut-и-пропустить-все/

Короче говоря, вам нужно определить RegistryKey в корне HKCU как подэлемент к Component и добавить элемент RemoveFolder в качестве подэлемента к Directory. Полный пример см. по ссылке выше. Кроме того:

  • Удалить атрибут KeyPath из элемента Component
  • RemoveFolder возможно, необходимо определить для всех папок. Я использовал фиктивный компонент без файла внутри для этого
person Ilia Barahovski    schedule 11.12.2012
comment
Спасибо. Хотя моя проблема решилась сама собой (!?), когда мы были вынуждены реструктурировать наши папки, я считаю, что ваш ответ - правильный способ сделать это. - person Torbjörn Bergstedt; 18.12.2012
comment
Удовольствие. У меня была такая же проблема. Поэтому добавлено решение для следующих парней, у которых оно будет. - person Ilia Barahovski; 18.12.2012
comment
Эта ссылка была недоступна для меня сегодня. Я не уверен, что это временно, но вот ссылка на архив на всякий случай: https://web.archive.org/web/20190916230607/https://robmensching.com/blog/posts/27/4/2007/Каксоздатьярлыкдляудаленияипройтивсе - person uberchris; 18.09.2020