MSI установщик отменить не работает - PullRequest
0 голосов
/ 30 сентября 2011

У меня есть установщик MSI (проект установки), который фактически вызывает exe-файл Windows Forms через system.diagnostic.process.

Эта форма на самом деле принимает данные от пользователя для восстановления файла .bak на сервере sql.

Но если произойдет какое-либо исключение, я не смогу отменить установку.Даже после нажатия кнопки «Отмена» установщика откат установки не начнется.

Пожалуйста, подскажите, как с этим справиться.

1 Ответ

1 голос
/ 30 сентября 2011

Создайте новый проект, который вызывает ваши формы windows exe и добавьте в него класс установщика, или просто добавьте класс установщика в свой exe форм windows (вам придется изменить его тип вывода и немного его изменить, например,отсутствует метод Main (), или объект запуска не задан, и ваша форма вызывается изнутри действия установки)

Класс установщика должен выглядеть следующим образом:

[RunInstaller(true)]
public  partial class Installer1 : System.Configuration.Install.Installer
{
    public Installer1()
    {
        InitializeComponent();
    }
    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Install(IDictionary stateSaver)
    {
        base.Install(stateSaver);
        // Do your magic here, call your form, do your thing...

    }
 [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Commit(IDictionary savedState)
    {

        base.Commit(savedState);
    }

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Rollback(IDictionary savedState)
    {
        // if something goes wrong, it's here you correct it and rollback the system to its previous state and undo what you already changed
        base.Rollback(savedState);
    }

    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
    public override void Uninstall(IDictionary savedState)
    {
        // Here you undo changes when you cancel
        base.Uninstall(savedState);
    }

}

Когда выПодготовьте ваш проект установщика, перейдите в настраиваемое действие проекта установки и добавьте основной вывод проекта установщика в «папки» установки, фиксации, отката и удаления.

Еще одна полезная вещь - это получить каталог, в который устанавливается ваше приложение, и передать его путь к классу установщика.Вы задаете для этого свойства CustomActionData своего пользовательского действия значение

/INSTALLDIR="[TARGETDIR]\"

, и в своем классе установщика вы получаете каталог, используя:

Context.Parameters["INSTALLDIR"]

РЕДАКТИРОВАТЬ: И установка будет отменена, если возникнет исключениевыбрасывается изнутри метода Install.Насколько я знаю, это единственный способ «отменить» вашу установку в середине.Вы должны создать исключение и выбросить его. Например, вот так:

If (SomethingWentWrong) throw new Exception("My exception description")

Конечно, если исключение было вызвано чем-то другим (я имею в виду, не добровольно «созданным» вами), откатШоуд также начать.Но если вы делаете какие-то пользовательские изменения, их нужно выбросить из метода установки установщика настраиваемого действия.

Извините, если я был слишком подробен, но я преодолел свой собственный набор проблем по этому поводу, поэтому я 'Я буду рад, если я могу помочь кому-то избежать этого:)

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