【问题标题】:Differentiating between uninstalling/installing and upgrading an application区分卸载/安装和升级应用程序
【发布时间】:2011-04-30 04:40:14
【问题描述】:

所以,我有这个应用程序,我们正在为其制作进一步的开发版本。

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

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

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

感谢您抽出宝贵的时间以及我可能得到的任何答案。

【问题讨论】:

    标签: c# .net deployment installation upgrade


    【解决方案1】:

    我最终也找到了一种方法来检查应用程序是升级还是全新安装:

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

    LocalMachine\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{应用程序的 GUID}

    当应用程序被卸载时,该信息被删除。

    • 但是您可以在安装应用程序版本时检查该信息(这可以通过在部署项目中添加一些自定义操作来完成)。我在 BeforeInstall 方法下检查它,并在注册表中查找 DisplayVersion 值,如下所示:
    
    
    RegistryKey regKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{AppGUIDHere}");
    string version = (string)regKey.GetValue("DisplayVersion");
    
    
    • 此值将包含您计算机上当前安装的版本。如果这个安装的版本小于你要安装的应用的版本,那么你就按照UPGRADING的逻辑路径

    • 如果您在该注册表项下的注册表中找不到任何内容,则表示这是全新安装(计算机上没有安装此应用程序之前的其他应用程序)。在这里,您遵循仅安装的其他逻辑路径

    希望这对某人有所帮助。

    【讨论】:

    • 感兴趣的是,DisplayVersion 是安装程序包中 ProductVersion 设置的值吗?
    • 我不认为这是应用程序获取 DisplayVersion 的地方(因为它没有相同的格式,即 DisplayVersion 有 4 个点分隔主要/次要等版本)。我认为它是从项目中的一些 AssemblyInfo.cs 文件中获取的。
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢 Rik,但我怎样才能获得以前版本的 ProductCode 或 PackageCode 等?
    • 有一个叫 Orca 的工具,它是 Windows SDK 的一部分(我认为),它是一个低级的 msi 编辑器。您应该能够检查以前的 MSI 包以获取详细信息。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      使用 wix 安装程序可以让您做出这种区分。这是一种更加亲力亲为的方法,但它会奏效。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 这不是所要求的,但恕我直言,这绝对是一个很好的答案,因为安装了一些愚蠢的软件,只需要通过另一个 MSI 安装程序更新(以及随后的服务器重新启动!)。我很高兴我们使用 InnoSetup 来部署(和升级)我们自己的软件。
        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2014-01-31
          • 2021-09-21
          • 1970-01-01
          • 1970-01-01
          • 2017-03-04
          • 1970-01-01
          • 2012-11-27
          • 1970-01-01
          • 2012-12-26
          相关资源
          最近更新 更多