Wix: измените расписание RegisrySearch и установите свойство в модуле слияния

У меня есть модуль слияния, который ищет некоторые места в реестре для чтения значений и сохранения в свойствах. Вот фрагмент кода:

  <Fragment Id="RegSearch">
<Property Id="HOST_APP_PATH" >
  <RegistrySearch Id="HOST_App"  
                  Root="HKLM"
                  Key="SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\HOST.exe"
                  Name="Path"
                  Type="raw"
                  />
</Property>
<Property Id="HOST_ROOT_PATH" >
  <RegistrySearch Id="HOST_Root"
                  Root="HKLM"
                  Key="SOFTWARE\HostApplication\Installation Info"
                  Name="HOST_Root"
                  Type="raw"
                  />
</Property>

Windows Installer puts this search in AppSearch custom action.

Проблема: AppSearch выполняет этот поиск очень рано, до WriteRegistryValues ​​из Host Installer, он не получит никаких значений, и свойства с этим поиском не будут определены, потому что реестр для поиска никогда не записывался в него.

Вопрос 1: Можно ли перенести этот поиск в реестр из модуля слияния после WriteRegistryValues ​​установщика хоста?

Вопрос 2: Есть ли другой способ поиска в реестре после того, как установщик хоста выполнит WriteRegistryValues? Наверное, с каким-то кастомным действием?


person Farrukh Waheed    schedule 26.04.2018    source источник


Ответы (1)


AppSearch - это стандартное действие, предоставляемое установщиком Windows, и изначально предназначено для запуска очень рано. Это связано с тем, что оно часто используется стандартным действием LaunchConditions, чтобы решить, можно ли продолжить установку. Это также полезно для принятия решения о необходимости установки функций и компонентов.

MSI - очень самоуверенный фреймворк. Я подозреваю, что что-то не так с вашим текущим дизайном, несовместимым с MSI.

Установщик хоста - это тот же MSI или другой MSI? Если предположить, что это то же самое, почему бы вам просто не поместить свои данные в некоторые свойства MSI и использовать эти свойства для записи в реестр? Тогда вам не нужно будет считывать значения обратно, потому что они уже есть в свойствах.

Зачем вам эти свойства после записи их в реестр? Обычно запись их в реестр была бы концом игры. Я не уверен, что еще ты делаешь дальше.

Если host.msi - это другой MSI, почему у вас один MSI устанавливает другой MSI? Это не дизайн MSI. В этом случае вам понадобится загрузчик. Хост MSI будет запускаться первым, а затем этот MSI. Но даже в этом случае довольно странно, что второй MSI будет зависеть от свойств, установленных первым MSI. Я бы подумал, что пользовательский интерфейс загрузчика и приложение будут собирать эту информацию и передавать ее как безопасные настраиваемые общедоступные свойства обоим MSI.

Чтобы ответить на вопрос 1: Нет, модуль слияния может только вставлять действия в последовательность. Он не может перенести действия. 2: вам нужно будет использовать настраиваемое действие. Но, как я уже сказал выше, мне кажется, что это неправильный путь.

person Christopher Painter    schedule 26.04.2018
comment
Спасибо. Нет, это не два MSI. host.msi отличается и потребляет msm. Поиск указанного выше свойства происходит в msm, и проблемы возникают после слияния msm с host.msi. - person Farrukh Waheed; 26.04.2018
comment
Я думаю, что вы смотрите на ваш MSM, который зависит от вашего MSI. Так не может быть. Я бы исследовал концепцию настраиваемых модулей слияния. wixtoolset.org/documentation/manual/v3/xsd/wix/ msdn.microsoft.com / en-us / library / windows / desktop / msdn.microsoft.com/en-us/library/windows/desktop/ - person Christopher Painter; 26.04.2018