Подтвердить что ты не робот

Как установить в папку LocalAppData?

Следующая настройка каталога отлично работает для меня.

<Directory Id='TARGETDIR' Name='SourceDir'>
  <Directory Id="ProgramFilesFolder">
    <Directory Id='INSTALLDIR' Name='MyApp'/>
  </Directory>
</Directory>

Однако, когда я попытался изменить "ProgramFilesFolder" на " LocalAppDataFolder", у меня появилось много ошибок при использовании light для связи и генерации моего msi:

D:\runGroup.wxs(53) : error LGHT0204: ICE38: Component cmpA5561BE36D80EB58252E69DDA0C2FF8C installs to user profile. It must use a registry key under HKCU as its KeyPath, not a file. D:\main.wxs(38) : error LGHT0204 : ICE64: The directory INSTALLDIR is in the user profile but is not listed in the Remove File table.

Похоже, что "LocalAppDataFolder" неприемлем для WiX, хотя я считаю, что это один из свойств системной папки, который определен в здесь.

Что я должен использовать для папки LocalAppData?

4b9b3361

Ответ 1

Я преобразовал приложение из установки perMachine в установку perUser. Чтобы правильно преобразовать установку, мне пришлось добавить раздел реестра для каждого из компонентов, которые у меня есть.

Первоначально у меня было следующее:

<Component Id="C.MyExe">
  <File Id="Fi.MyExe" Name="$(var.MyExe.TargetFileName)" Source="$(var.MyExe.TargetPath)" DiskId="1">
    <Shortcut Id="SC.StartMenu"
              Directory="D.ApplicationMenuDir"
              Name="$(var.AppName)"
              WorkingDirectory="INSTALLDIR"
              Icon="MY_ICON.ico"
              IconIndex="0" 
              Advertise="yes"
      />
      ...

Когда я переместил компонент exe в пользовательскую установку, мне пришлось сделать что-то вроде этого:

<Directory Id="LocalAppDataFolder" Name="AppData">
  <Directory Id="MyAppDirectory" Name="$(var.AppName)">
    <Component Id="C.MyExe" Guid="{MY_GUID}">
      <CreateFolder />
      <RemoveFolder Id="RemoveMyAppDirectory" On="uninstall" />
      <RegistryKey Root="HKCU" Key="Software\MyCompany\MyApp">
        <RegistryValue Name="MainExe" Value="1" KeyPath="yes" Type="integer" />
      </RegistryKey>
      <File Id="Fi.MyExe" Name="$(var.MyExe.TargetFileName)"
          Source="$(var.MyExe.TargetPath)" DiskId="1" Checksum="yes">
      </File>
    </Component>
   ...

Самая важная часть заключается в том, что вам нужно будет добавить раздел реестра, который указывает на HKEY_CURRENT_USER. Я добавил значение реестра для каждого компонента, который указывает, что компонент установлен.

Мне также пришлось удалить следующее: Advertise="yes".

Ответ 3

Хорошо, только что нашлось, что мы можем сделать это, перезаписав "ProgramFilesFolder":

<SetProperty Id="ProgramFilesFolder" Value="[LocalAppDataFolder]" Before="CostFinalize"><![CDATA[NOT Privileged]]></SetProperty>

Другое дело, что в <Package> нам нужно установить InstallPrivileges в limited.

Ну, я не вижу причин, по которым "ProgramFilesFolder" можно использовать напрямую, в то время как "LocalAppDataFolder" не может.

Ответ 4

У меня была эта проблема в последнее время. Я хотел конвертировать мой установщик из каждой машины в отдельного пользователя, но получал ICE38. Я спросил у wix-пользователей, и одно мнение заключалось в том, что вы можете игнорировать ICE38, потому что это подразумевалось как проверка на установку для каждой машины.

Смотрите обсуждение в wix-users.

Так как это так, ICE38 (на мой взгляд) неверен, и вы захотите его проигнорировать. ICE38 подразумевает, что вы устанавливаете ресурсы для каждого пользователя в контексте установки на каждом компьютере, но никогда не проверяете, что это так.

На самом деле для создания установки для каждого пользователя требуется, чтобы вы игнорировали ICE38  потому что он никогда не будет точным для этого мира.

[Изменить] Похоже, вы получили помощь здесь.

От Питера Ширтклиффа:

Это мое собственное, по общему признанию, неопытное понимание систем для каждого пользователя:

Установка в подкаталог LocalAppDataFolder в порядке для каждого пользователя MSI. Из-за определенных сценариев, связанных с перемещающимися пользователями, вы необходимо добавить компоненты, содержащие элементы для любого каталоги, созданные в LocalAppDataFolder. Вот почему ICE64 появляться.

Ошибка ICE38 немного вводит в заблуждение: поскольку у вас есть пользователь установка, безопасно игнорировать, пока пользователь не может выбрать альтернативное место установки, которое является общим для всех пользователей. ICE38 - проверка ситуации, когда несколько пользователей устанавливают одинаковые компонент к одному и тому же пути.

Просто отправьте, чтобы помочь другим людям (например, мне).