MSI安装程序取消不工作

本文关键字:工作 取消 程序 安装 MSI | 更新日期: 2023-09-27 18:10:12

我有一个MSI安装程序(设置项目),它实际上通过system.diagnostic.process调用Windows Forms exe。

这个表单实际上接受用户的输入来恢复sql server中的.bak文件。

但是如果出现任何异常,我无法取消设置。即使在单击安装程序的取消按钮后,也不会开始安装回滚。

请建议如何处理

MSI安装程序取消不工作

创建一个新的项目,调用你的windows窗体exe并添加安装类,或者只是添加安装类到你的windows窗体exe(你必须改变它的输出类型和修改它一点,所以,例如,没有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);
    }
}

当你的安装项目准备好后,进入你的安装项目Custom Action,并将你的安装项目的主要输出添加到它的安装、提交、回滚和卸载文件夹中。

另一个有用的事情是获得你的应用程序正在安装的目录,并将其路径传递给你的安装程序类。您可以将自定义操作的CustomActionData属性设置为

/INSTALLDIR="[TARGETDIR]'"

,在您的安装程序类中,您使用

获得目录:
Context.Parameters["INSTALLDIR"]

编辑:如果在Install方法中抛出异常,安装将被取消。据我所知,这是在中间"取消"安装的唯一方法。你必须创建一个异常并抛出它。,例如:

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

当然,如果异常是由其他东西抛出的(我的意思是,不是由您"创建"的),回滚也应该开始。但如果你做了一些自定义更改,它必须从自定义操作的安装程序的install方法中抛出。

如果我有点太详细了,我很抱歉,但我已经度过了我自己的一套麻烦,所以如果我能帮助别人避免它,我会很高兴的:)