Я хочу включить обновление во 2-й версии нашего пользовательского установщика WiX.В моем Product.wxs идентификатор продукта установлен на *, версия установлена на 2.0.0, и код обновления остается таким же, как и в первой версии.Чтобы обнаружить обновление, я использовал обработчик событий DetectRelatedBundle в Boostrapper.
Тег MajorUpgrade в MSI выглядит так:
<MajorUpgrade AllowDowngrades="no" DowngradeErrorMessage="A newer version of [ProductName] is already installed." AllowSameVersionUpgrades="no" Schedule="afterInstallInitialize" />
В моем инсталляционном интерфейсе у меня есть кнопка Install.Когда эта кнопка нажимается во время сценария обновления, я вызываю PlanAction и передаю LaunchAction.Install.Но как только начинается установка, он показывает другой экземпляр BA, который, как я полагаю, является старым пакетом, вызванным моим текущим BA для удаления старой версии.Чтобы скрыть новый экземпляр BA и просто показать прогресс установки, я внес следующие изменения в свой Bootstrapper:
Bootstrapper.cs:
protected override void Run()
{
BootstrapperDispatcher = Dispatcher.CurrentDispatcher;
try
{
_model = new BootstrapperApplicationModel(this);
var uninstall = new UpgradeUninstall(_model);
if (uninstall.IsUpgradeUninstallation())
{
uninstall.PerformSequence();
}
else
{
//show install or uninstall main UI
this.WireUpEventHandlers();
_model.BootstrapperApplication.Engine.Detect();
Dispatcher.Run();
}
}
}
UpgradeUninstall.cs:
public class UpgradeUninstall
{
private BootstrapperApplicationModel _bootStrapperModel;
public UpgradeUninstall(BootstrapperApplicationModel model)
{
_bootStrapperModel = model;
}
public void Perform()
{
this.WireUpEventHandlers();
_bootStrapperModel.BootstrapperApplication.Engine.Detect();
}
public bool IsUpgradeUninstallation()
{
var action = _bootStrapperModel.BootstrapperApplication.Command.Action;
var display = _bootStrapperModel.BootstrapperApplication.Command.Display;
return action == LaunchAction.Uninstall && (display == Display.None || display == Display.Embedded);
}
private void WireUpEventHandlers()
{
_bootStrapperModel.BootstrapperApplication.DetectComplete += OnDetectComplete;
_bootStrapperModel.BootstrapperApplication.PlanComplete += OnPlanComplete;
_bootStrapperModel.BootstrapperApplication.ApplyComplete += OnApplyComplete;
}
private void OnDetectComplete(object sender, DetectCompleteEventArgs e)
{
this._bootStrapperModel.PlanAction(LaunchAction.Uninstall);
}
private void OnPlanComplete(object sender, PlanCompleteEventArgs e)
{
this._bootStrapperModel.ApplyAction();
}
private void OnApplyComplete(object sender, ApplyCompleteEventArgs e)
{
BootstrapperDispatcher.InvokeShutdown();
}
}
Вопрос 1) Как я сообщу своему основному экземпляру BA (который выполняет установку), что удаление старого пакета завершено?Что происходит сейчас, так это то, что он смог успешно удалить старый пакет, но установка новой версии не производится.
Вопрос 2) Правильно ли я понимаю обновление WiX?:)