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>...<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 = "true""/>