MSI安装程序取消不工作
本文关键字:工作 取消 程序 安装 MSI | 更新日期: 2023-09-27 18:10:12
我有一个MSI安装程序(设置项目),它实际上通过system.diagnostic.process调用Windows Forms exe。
这个表单实际上接受用户的输入来恢复sql server中的.bak文件。
但是如果出现任何异常,我无法取消设置。即使在单击安装程序的取消按钮后,也不会开始安装回滚。
请建议如何处理
创建一个新的项目,调用你的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方法中抛出。
如果我有点太详细了,我很抱歉,但我已经度过了我自己的一套麻烦,所以如果我能帮助别人避免它,我会很高兴的:)