Как выполнить Wix Upgrade с помощью пользовательского загрузчика - PullRequest
0 голосов
/ 15 мая 2018

Я хочу включить обновление во 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?:)

1 Ответ

0 голосов
/ 29 октября 2018

Что происходит, так это то, что ваш старый БА вызывается в бесшумном режиме с помощью переключателя удаления. Я вижу, что в вашем коде есть некоторые сантехники для удаления командной строки, хотя я не вижу, где вы вызываете Engine.Plan (LaunchAction.Uninstall).

В1) Я не верю, что вам нужно что-то делать, чтобы ваш первоначальный БА знал, что вы закончили. Вам просто нужно выйти из установки обычным способом.

Q2) Да, я думаю, ты почти у цели. Я предлагаю вам скачать исходный код WIX с git, чтобы увидеть, как он реализует свой собственный BA. В частности, посмотрите на код DetectComplete:

private void DetectComplete(object sender, DetectCompleteEventArgs e)
{
    // Parse the command line string before any planning.
    this.ParseCommandLine();
    this.root.InstallState = InstallationState.Waiting;

    if (LaunchAction.Uninstall == WixBA.Model.Command.Action)
    {
        WixBA.Model.Engine.Log(LogLevel.Verbose, "Invoking automatic plan for uninstall");
        WixBA.Plan(LaunchAction.Uninstall);
    }

Вы видите, что он проверяет параметр командной строки удаления и сразу же запускает удаление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...