Я новичок в упаковке программного обеспечения. Я использую cpack + Wix. Я пытался найти полезную информацию или хорошую документацию по util:RestartResource, но не смог найти ответ на свой вопрос.
Проблема: мне нужно установить расширение ShellExtension, которое требует перезапуска explorer.exe после установки некоторых значений реестра. Поэтому я использую команду (https://wixtoolset.org/documentation/manual/v3/xsd/util/restartresource.html):
<util:RestartResource ProcessName="explorer.exe"/>
Все работает почти так, как ожидалось. Explorer.exe будет уничтожен, как и ожидалось, но перезапуск explorer.exe будет запущен после того, как пользователь завершит установку. Это неприятно, потому что explorer.exe исчезает, пока пользователь не нажмет кнопку завершения установки. Я хотел бы прямой перезапуск проводника после того, как значения реестра были установлены. Я знаю, что это должно быть возможно, потому что, если WiX сам запускает перезапуск explorer.exe, он будет выполнен немедленно и не будет ждать завершения установки. В чем хитрость? Я уже пробовал CustomActions и размещал util:RestartResource в другом месте кода WiX (я в отчаянии).
[EDIT] Я анализирую журналы установки. И я понял, что по умолчанию Restart Manager вызывается в начале прогресса и закрывается перед финальным диалогом. Если я добавлю ProcessName в RestartResource, он откроет другой диспетчер перезапуска, который закрылся после последнего диалога. Нужно выяснить, как вызвать RestartResource как RestartResource по умолчанию.
[EDIT2] Думаю, util:RestartResource содержит ошибки. На данный момент я сканирую код реализации WiX и документацию MSI, и обычно вы должны зарегистрировать все RestartResources до состояния «InstallValidate». И это именно то, что WiX пытается сделать в UtilExtension_Platform.wxi:
<Fragment>
<CustomAction Id="WixRegisterRestartResources$(var.Suffix)" BinaryKey="WixCA" DllEntry="WixRegisterRestartResources$(var.Suffix)" Execute="immediate" Return="check" SuppressModularization="yes" />
<InstallExecuteSequence>
<Custom Action="WixRegisterRestartResources$(var.Suffix)" Before="InstallValidate" Overridable="yes" />
</InstallExecuteSequence>
</Fragment>
Потому что после этого состояния MsiRestartManagerSessionKey будет завершен. И WiX пытается использовать этот ключ в случае регистрации RestartResource. Но в журналах я вижу, что мой вызов util:RestartResource всегда будет выполняться после состояния «InstallValidate». И журнал уже говорит в этот момент, что MsiRestartManagerSessionKey был завершен ранее (после состояния «InstallValidate»). Это с моей точки зрения противоречит политике MSI.
[EDIT3] Это не ошибка. Я опубликую авсер.