WiX: как получить доступ / изменить каталог установки в управляемом загрузчике?

Я создаю приложение настройки WPF с пользовательским интерфейсом. Я начал с урока Брайана П. Джонстона: http://bryanpjohnston.com/2012/09/28/custom-wix-managed-bootstrapper-application/

Где-то, на мой взгляд, у меня есть простой TextBox который связывает с собственностью InstallationPath в моем MainViewModel,

Теперь я хочу, чтобы этот путь использовался, когда пользователь нажимает "Установить". Для этого у меня есть кнопка, которая привязывается к моему InstallCommand, Вызывается следующий метод (взятый непосредственно из учебника):

private void InstallExecute()
{
    Bootstrapper.Engine.Plan(LaunchAction.Install);
}

Как я могу сделать пакеты для установки в каталог моей собственности InstallationPath?


Редактировать:

Я нашел похожий вопрос здесь, на Stackru:

Укажите УСТАНОВКУ пакетов в WiX внутри управляемого загрузчика Burn.

Ответ есть от Боба Арнсона

Используйте дочерний элемент MsiProperty для каждого MsiPackage, чтобы указать INSTALLLOCATION =[BurnVariable]. Затем используйте Engine.StringVariables, чтобы установить BurnVariable.

Теперь я думаю, что смогу получить доступ к StringVariables в моем InstallExecute как это

private void InstallExecute()
{
    Bootstrapper.Engine.StringVariables["BurnVariable"] = InstallationPath;
    Bootstrapper.Engine.Plan(LaunchAction.Install);
}

Но где определить эту переменную? Я думаю, где-нибудь в Product.wxs?

2 ответа

Решение

Да, просто создайте переменную в вашем сжатом загрузчике:

<Variable Name="BurnVariable"
          bal:Overridable="yes" />

затем вы можете передать это как параметр в ваш загруженный MSI-пакет:

<MsiPackage SourceFile="$(var.YourMsiProject.Installer.TargetPath)" Compressed="no">
    <MsiProperty Name="INSTALLLOCATION" Value="[BurnVariable]" />          
</MsiPackage>

Одно отсутствующее свойство "Тип" в элементе Bundle Variable. caverman_dick прав, но это не работает должным образом, когда не может быть переопределено. Вы можете попробовать это тоже, установив Type="string".

Переменный элемент Wix

<Wix>...<Bundle>...
  <Variable Name="MyApplicationMsiInstallFolder" Value="[WindowsVolume]MyApplication"
          bal:Overridable="yes" Type="string"/>
    <Chain>
        <?if $(var.DbVersion) = false?>
        <PackageGroupRef Id="AccessDatabaseGroup"/>
        <RollbackBoundary />
        <?endif?>
        <MsiPackage Id="MyApplicationMsiPackage" SourceFile="$(var.MyApplicationSetup.TargetPath)" DisplayInternalUI="no"
                                Vital="yes" >
            <MsiProperty Name="APPLICATIONFOLDER" Value="[MyApplicationMsiInstallFolder]"/>
        </MsiPackage>
    </Chain>
</Bundle></Wix>

Я также использую этот легендарный урок. Я хотел использовать veriable для чего-то еще. А именно переменная говорит, нужно ли устанавливать программу. Проблема в том, что переменная не перезаписывается при ее вызове в InstallExecute(). Для моей проблемы это работает так:

  protected override void Run()
    {
        this.Engine.Log(LogLevel.Verbose, "Launching custom TestBA UX");
        BootstrapperDispatcher = Dispatcher.CurrentDispatcher;


        MainViewModel viewModel = new MainViewModel(this);
        viewModel.Bootstrapper.Engine.Detect();

        MainView view = new MainView();
        this.Engine.StringVariables["SqlStatus"] = view.CheckInstalledSQL() == true ? "true" : "false";
        this.Engine.StringVariables["SsmsStatus"] = view.CheckInstalledSSMS() == true ? "true" : "false";
        view.DataContext = viewModel;
        view.Closed += (sender, e) => BootstrapperDispatcher.InvokeShutdown();
        view.Show();
        Dispatcher.Run();

        this.Engine.Quit(0);
    }

Загрузчик:

<Variable Name="SqlStatus" bal:Overridable="yes" Value="false" Type="string"/>
<Variable Name="SsmsStatus" bal:Overridable="yes" Value="false" Type="string"/>
...

<ExePackage Id="SSMS" Name="SQLServerManagementStudio" Cache="no" Compressed="yes" PerMachine="yes" Permanent="yes" Vital="yes"
    InstallCommand="/install /Passive SSMSInstallRoot=C:\\Program Files\\Microsoft SQL Server /norestart"
    SourceFile="C:\Users\..\Downloads\SSMS-Setup-ENU.exe"
    DetectCondition="SsmsStatus = &quot;true&quot;"/>
Другие вопросы по тегам