Запуск программы после выполнения функции восстановления работает из setup.exe (bootstrapper), но не из MSI - PullRequest
0 голосов
/ 17 апреля 2020

Первый пост, так что надеюсь, что я не напортачу.

Я использую WiX для создания загрузчика MSI и setup.exe, который выполняет один из исполняемых файлов, развернутых проектом. Это работает, как и ожидалось для стандартных установок, но не работает при запуске из опции восстановления на MSI. Есть несколько причуд к этому:

  • Это работает , если я запускаю setup.exe во второй раз. Это вызывает пользовательский интерфейс, который спрашивает, хотите ли вы изменить, восстановить или удалить приложение, и в конце он запускает exe-файл, как и ожидалось.
  • Если я запускаю пакет msi второй раз, он показывает диалог изменения, исправления или удаления, но на соревновании он не запускает исполняемый файл, как мне хотелось бы.
  • Если я использую опцию восстановления из «Установка и удаление программ», она не показывает диалог изменения, восстановления или удаления, вы просто видите индикатор прогресса на экране для кратчайших моментов (небольшое приложение) и тогда это останавливается.

Я пробовал несколько методов, чтобы попытаться заставить это работать, но все они сосредоточены на следующем.

У меня есть пользовательское действие, определенное следующим образом:

<CustomAction Id="Install" FileKey="ApplicationIWouldLikeToRun.exe" ExeCommand="/install" Execute="immediate" Impersonate="yes" Return="asyncNoWait" />

В конце моего раздела пользовательского интерфейса у меня есть обработчик событий на кнопке Fini sh:

<UI>
        <UIRef Id="WixUI_InstallDir"/>

        <!-- Run the Installer after the Exit Dialog -->
        <Publish Dialog="ExitDialog" Control="Finish" Order="1" Event="DoAction" Value="Install">NOT Installed OR (REINSTALL=Complete) OR (REINSTALL=ALL)</Publish>
</UI>

В разделе я пробовал различные формы следующего, но ни один из них, похоже, не получил запускается в опции восстановления

<Custom Action="Install" After="InstallFinalize">REINSTALL ~= "Complete" OR REINSTALL ~= "ALL"</Custom>

Ниже приведен фрагмент кода для раздела GUI:

    <!-- =================== -->
    <!-- UPGRADE INFORMATION -->
    <!-- =================== -->
    <Upgrade Id="$(var.UpgradeCode)">
        <UpgradeVersion Minimum="4.0.0" Maximum="$(var.Version)" Property="PREVIOUSVERSIONSINSTALLED" IncludeMinimum="yes" IncludeMaximum="no" />
        <UpgradeVersion Minimum="$(var.Version)" OnlyDetect="yes" Property="NEWERVERSIONDETECTED" />
    </Upgrade>
    <Condition Message="A later version of [ProductName] is already installed. Setup will now exit.">NOT NEWERVERSIONDETECTED OR Installed</Condition>


    <!-- ========== -->
    <!-- GUI DESIGN -->
    <!-- ========== -->
    <UI>
        <UIRef Id="WixUI_InstallDir"/>

        <Property Id="ALLUSERS"><![CDATA[2]]></Property>
        <Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER" />

        <!-- Run the Installer after the Exit Dialog -->
        <Publish Dialog="ExitDialog" Control="Finish" Order="1" Event="DoAction" Value="Install">NOT Installed OR (REINSTALL=Complete) OR (REINSTALL=ALL)</Publish>
    </UI>

    <WixVariable Id="WixUIDialogBmp" Value="bg_$(var.Manufacturer).bmp" />
    <WixVariable Id="WixUIBannerBmp" Value="banner_$(var.Manufacturer).bmp" />


    <!-- ============================================= -->
    <!-- CUSTOM ACTIONS                                -->
    <!-- ============================================= -->

    <CustomAction Id="Install" FileKey="Installer.exe" ExeCommand="/install &quot;[SourceDir]\packages&quot;" Execute="immediate" Impersonate="yes" Return="asyncNoWait" />
    <CustomAction Id="UninstallLicense" FileKey="Installer.exe" ExeCommand="/uninstalllicense" Execute="immediate" Impersonate="yes" />
    <CustomAction Id="Uninstall" FileKey="Installer.exe" ExeCommand="/uninstall" Execute="immediate" Impersonate="yes" />
    <CustomAction Id="Cleanup" FileKey="Installer.exe" ExeCommand="/cleanup" Execute="immediate" Impersonate="yes" />

    <InstallExecuteSequence>
        <RemoveExistingProducts After="InstallInitialize"/>
        <Custom Action="UninstallLicense" Before="Uninstall">Installed AND NOT UPGRADINGPRODUCTCODE AND (REMOVE="ALL")</Custom>
        <Custom Action="Uninstall" Before="RemoveFiles">REMOVE ~= "Complete" OR REMOVE ~= "ALL"</Custom>
        <Custom Action="Cleanup" After="Uninstall">REMOVE ~= "Complete" OR REMOVE ~= "ALL"</Custom>
        <Custom Action="Install" After="InstallFinalize">REINSTALL ~= "Complete" OR REINSTALL ~= "ALL"</Custom>
    </InstallExecuteSequence>
...