Запустить приложение после установки с помощью WiX/Burn

Мне известно о подобных вопросах в WiX MSI, но у меня возникают проблемы с запуском приложения в загрузочном файле EXE, созданным с помощью Burn после установки. Мой полный комплект ниже.

Если это имеет какое-то значение для сценария, загрузчик запускается в пассивном режиме, поэтому пользователю не нужно ничего нажимать.

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

    <Bundle Name="My Company AutoUpdater"
            Version="1.0.11"
            Manufacturer="My Company"
            UpgradeCode="--GUID--">

        <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.HyperlinkLicense">

            <bal:WixStandardBootstrapperApplication SuppressOptionsUI="yes"
                                                    LicenseUrl=""
                                                    LogoFile="logo.png" />
        </BootstrapperApplicationRef>

        <Chain>
            <MsiPackage SourceFile="..\App1\bin\Release\App1.msi" />
            <MsiPackage SourceFile="..\App2\bin\Release\App2.msi" />
        </Chain>
    </Bundle>

    <Fragment>
        <Property Id="WixShellExecTarget" 
                  Value="[#C:\Program Files (x86)\My Company\App1.exe]" />

        <Binary Id="MyCA"
                SourceFile="[#C:\Program Files (x86)\My Company\App1.exe]"/>

            <CustomAction Id="LaunchApplication"
                          BinaryKey="MyCA"
                          ExeCommand="-switch"
                          Execute="deferred"
                          Return="check"
                          HideTarget="no"
                          Impersonate="no" />

            <InstallExecuteSequence>
                <Custom Action="LaunchApplication" 
                        After="InstallFiles" />
            </InstallExecuteSequence>
    </Fragment>
</Wix>

Ответы

Ответ 1

У него было несколько шагов. Помните, что я запускал это из загрузочного файла, а не файла MSI, поэтому ответа levarius было бы достаточно.

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

Затем пакет (называемый PostInstall ниже) запускается ТОЛЬКО, если один из других пакетов был установлен ранее - найден по наличию ключа в реестре (установленному в каждом продукте MSI). Это означает, что никакое приложение не будет запущено автоматически после завершения новой установки.

Ниже приведено описание пакета bootstrapper (WiX 3.6 в моем случае)

<!-- Determine what items are installed in the event of an upgrade-->
<util:RegistrySearch Root="HKLM"
                     Key="SOFTWARE\CompanyName"
                     Value="ProductAInstalled"
                     Variable="ProductAInstalled"
                     Result="exists"
                     Format="raw" />
<util:RegistrySearch Root="HKLM"
                     Key="SOFTWARE\CompanyName"
                     Value="ProductBInstalled"
                     Variable="ProductBInstalled"
                     Result="exists"
                     Format="raw" />

<Chain>
    <!-- Package for .NET prerequisite. References a Package that is
         actually in the referenced WiX file WixNetFxExtension. -->
    <PackageGroupRef Id="NetFx40Web"/>

    <MsiPackage SourceFile="..\SetupProductA\bin\Release\SetupProductA.msi"
                InstallCondition="(chkProductA) OR (ProductAInstalled)" />

    <MsiPackage SourceFile="..\SetupProductB\bin\Release\SetupProductB.msi"
                InstallCondition="(chkProductB) OR (ProductBInstalled)" />

    <!-- Run PostInstall only if this was run as part of an upgrade. -->
    <!-- NB: This is the portion that kicks off the downloaded bootstrapper. -->
    <MsiPackage SourceFile="..\PostInstall\bin\Release\PostInstall.msi"
                InstallCondition="(ProductAInstalled) OR (ProductBInstalled)" />
</Chain>

Ответ 2

Вы можете добавить переменную в свой пакет "LaunchTarget" с указанием пути к исполняемому файлу, который вы хотите запустить:

<Variable Name="LaunchTarget" Value="[InstallFolder]\path\to\file.exe"/>

После установки на экране "Настройка успешно" появится кнопка "Запуск", которая запустит ваше приложение.

Ответ 3

Используйте рекомендации, приведенные в руководстве по WiX, Как запустить запущенное приложение после установки. Существует встроенное расширение WiX, которое будет обрабатывать это для вас. Вы должны иметь возможность ссылаться на расширение WiX Util, добавить следующий код в свой проект (заменив значение свойства, конечно), а затем запланировать действие для запуска:

<Property Id="WixShellExecTarget" 
          Value="[#myapplication.exe]" />
<CustomAction Id="LaunchApplication" 
              BinaryKey="WixCA" 
              DllEntry="WixShellExec" 
              Impersonate="yes" />