区分卸载/安装和升级应用程序

时间:2010-10-25 12:28:56

标签: c# .net deployment installer upgrade

所以,我有这个应用程序,我们正在为其生成更多的开发版本。

如果用户卸载了应用程序(例如,使用“添加/删除程序”),那么我希望应用程序删除文件系统中包含应用程序相关信息的某个文件夹。

但是,如果应用程序已升级(通过下载此应用程序的较新安装程序并安装它),那么我希望它保留该文件夹。

我的印象是(目前)无法区分卸载/安装以及只是将应用程序从一个版本更新到另一个版本,因为.NET部署项目将升级视为另一个卸载/安装过程,但这应该是可能的。

感谢您花时间和我可能得到的任何答案。

6 个答案:

答案 0 :(得分:2)

安装程序有三个GUID代码,ProductCode,PackageCode和UpgradeCode,可用于管理这些方案:UpgradeCode就像一个应用程序ID,不应在版本之间更改; PackageCode标识您的设置版本,ProductCode标识您的软件版本。 您可以通过递增ProductVersion值来更改ProductCode。

Windows使用ProductCode查看系统上是否已安装该应用程序。如果使用具有相同ProductCode和PackageCode的安装程序重新安装,则会获得修复/卸载选项。

答案 1 :(得分:1)

这不是直接的答案,但您是否考虑过使用第三方安装软件?我们使用InnoSetup来分发.Net应用程序,我们发现它非常易于使用且非常灵活。它当然可以处理你所描述的内容。

答案 2 :(得分:0)

您是否尝试过使用ClickOnce部署?它处理应用程序的所有安装和升级。通过更改更新中包含的文件的发布状态,您可以控制文件是否被更新覆盖或保持不变。卸载应用程序后,将删除所有文件。

答案 3 :(得分:0)

使用wix安装程序可以实现这种差异化。这是一种更实际的方法,但它会起作用。

答案 4 :(得分:0)

您还可以尝试添加一些自定义预安装操作,该操作会将提到的文件夹复制到某个临时文件夹,然后安装后操作会将其复制回原位。但请首先考虑上述消息,例如使用更强大的安装程序或clickOnce。

答案 5 :(得分:0)

我最终还想出了一种检查应用程序是否正在升级或是否是全新安装的方法:

  • 应用程序在注册表中留下一些有关自身的信息(应用程序名称,版本号等)。这通常存储在
  

LocalMachine \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall \ {Application's GUID}

卸载应用程序后,该信息将被删除。

  • 但是,您可以在安装应用程序版本时检查该信息(这可以通过在部署项目中添加一些自定义操作来完成)。我在 BeforeInstall 方法下查看它,并在注册表中查找 DisplayVersion 值,如下所示:


RegistryKey regKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{AppGUIDHere}");
string version = (string)regKey.GetValue("DisplayVersion");

  • 此值将包含计算机上当前安装的版本。如果此安装版本小于您尝试安装的应用程序版本,则遵循UPGRADING的逻辑路径

  • 如果在该密钥下的注册表中找不到任何内容,则表示这是全新安装(在安装此计算机之前没有其他应用程序)。在这里,您可以按照安装

  • 的其他逻辑路径进行操作

希望这有助于某人。