MSI安装程序取消不起作用

时间:2011-09-30 14:00:13

标签: c# deployment windows-installer

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

此表单实际上是从用户那里获取输入以恢复sql server中的.bak文件。

但如果发生任何异常,我无法取消设置。即使单击安装程序的取消按钮,安装回滚也不会启动。

请建议如何处理。

1 个答案:

答案 0 :(得分:1)

创建调用windows forms 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);
    }

}

准备好安装程序项目后,转到安装项目“自定义操作”,并将安装程序项目的主要输出添加到其安装,提交,回滚和卸载“文件夹”。

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

/INSTALLDIR="[TARGETDIR]\"

并在安装程序类中使用以下命令获取目录:

Context.Parameters["INSTALLDIR"]

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

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

当然,如果异常是由其他东西抛出的(我的意思是,你不愿意“创造”),那么回滚也会开始。但是,如果您进行一些自定义更改,则必须从自定义操作的安装程序的安装方法中抛出它。

对不起,如果我有点过于详细,但我遇到了自己的麻烦,所以如果我可以帮助某人避免它,我会很高兴:)