我在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中找不到这个属性/动作。我在哪里可以找到它?
有人可以帮我解决这个问题吗?
答案 0 :(得分:0)
在Visual Studio安装项目中,它是安装项目的RemovePreviousVersions属性,与制造商,版本等其他属性一起使用。
如果您在解决方案资源管理器中选择安装项目并执行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会隐藏它们。