如何在msi文件

时间:2017-11-02 06:56:27

标签: c# visual-studio-2015 windows-installer msiexec

我在VS2015中为我的软件制作了一个msi项目。我已经制作了基于.Net的桌面应用程序。我的要求是我想处理2个案例: -

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

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

现在在我的安装项目中,我添加了自定义操作以进行安装和卸载,其中我已经给出了我的dll路径并将Installer Class属性设置为true。在这个dll中,我创建了一个继承自System.Configuration.Install.Installer的类并处理Install,beforeInstall,如下所示卸载: -

    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");
        }
}

现在在卸载时,我删除了DB。如果我从控制面板卸载并且它也删除了我的DB文件,它工作正常。

但是如果我想升级我的产品,那么在使用我的覆盖功能之前,比如安装或者在安装之前它会显示错误"已经安装了该产品的另一个版本。安装此版本无法继续。要配置或删除现有版本的产品,请使用控制面板的添加/删除程序"。

现在我已经在互联网上搜索了,似乎如果我更新我的包裹代码或产品版本,它应该可以安装在它上面。现在我有以下问题: -

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

2-我尝试使用Orca编辑它,但即便如此,如果我尝试安装已编辑的MSI文件(包含更新的版本号,包代码和产品代码),我也面临同样的错误。

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

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

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

1 个答案:

答案 0 :(得分:0)

在Visual Studio安装项目中,它是安装项目的RemovePreviousVersions属性,与制造商,版本等其他属性一起使用。

  1. 增加安装版本的项目版本,接受更改。
  2. 将RemovePreviousVersions设置为true。
  3. UpgradeCode需要相同,所以不要更改它。
  4. 增加需要更新的二进制文件的文件版本。
  5. 如果您在解决方案资源管理器中选择安装项目并执行F4,您应该会看到相关属性。

    不要担心PackageCode,因为Visual Studio会为每个版本创建一个新的版本。

    Visual Studio自定义操作全部在安装文件后运行(尽管名称为“之前”),因此您无法做任何事情来影响安装过程。无论如何你不需要它们。

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

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

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