Я новичок в деле упаковки программного обеспечения. Я использую 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] Я анализирую логи установки. И я понял, что по умолчанию менеджер перезапуска вызывается в начале процесса и закрывается перед финальным диалогом. Если я добавлю 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] Это не глючит. Я опубликую сообщение.