代码之家  ›  专栏  ›  技术社区  ›  bulunga

如何在msi文件中安装新版本时自动卸载

  •  1
  • bulunga  · 技术社区  · 8 年前

    1-如果我们的软件已经安装,并且用户尝试安装,它应该自动卸载现有软件并删除数据库文件(由我的应用程序创建)。

    2-如果安装的版本较低,那么它应该只卸载应用程序,并保持我的数据库文件不变。

    现在,在我的安装项目中,我添加了安装和卸载的自定义操作,其中我给出了dll的路径,并将安装程序类属性设置为true。在这个dll中,我从系统继承了一个类。配置安装安装程序和句柄安装,安装前,卸载如下:--

        public partial class SetupManager : System.Configuration.Install.Installer
        {
            public SetupManager()
            {
                InitializeComponent();
                this.BeforeInstall += SetupManager_BeforeInstall;
                //this.Committed += new InstallEventHandler(DarkMailInstaller_Committed);
            }
    
            private void SetupManager_BeforeInstall(object sender, InstallEventArgs e)
            {
                MessageBox.Show("In Install event");
            }
    }
    

    但是,如果我想升级我的产品,在我的覆盖功能(如install或BeforeInstall)被点击之前,它会显示错误“此产品的另一个版本已经安装。无法继续安装此版本。要配置或删除现有版本的产品,请使用控制面板的添加/删除程序”。

    1-在VS 2015中,我在安装项目中没有任何可以设置产品版本或包代码的属性?

    3-我不知道为什么在执行安装前事件之前会出现此错误?

    4-我发现“RemoveExistingProducts”在这种情况下会有所帮助。但我在VS2015中找不到这个属性/动作。我在哪里可以找到它?

    有人能帮我解决这个问题吗?

    1 回复  |  直到 8 年前
        1
  •  0
  •   PhilDW    8 年前

    在Visual Studio安装项目中,它是安装项目的RemovePreviousVersions属性,以及其他属性,如制造商、版本等。

    1. 将RemovePreviousVersions设置为true。
    2. 升级代码需要相同,所以不要更改它。

    如果在解决方案资源管理器中选择安装项目并执行F4,则应看到相关属性。

    不要担心PackageCode,因为Visual Studio在每个构建中都会创建一个新的包,这是应该的。

    你得到的是一个微星,将作为一个新的安装新的客户。它还将在安装时升级旧产品,而Windows Installer覆盖规则意味着由应用程序更新的数据文件将不会被替换。

    https://msdn.microsoft.com/en-us/library/windows/desktop/aa370531(v=vs.85).aspx

    生成的MSI将在安装结束时对RemoveExistingProducts进行排序。基本上,您不需要担心包代码的内部等等,因为Visual Studio隐藏了它们。