【问题标题】:Best method for implementing Self-Updating Software实施自我更新软件的最佳方法
【发布时间】:2009-07-31 11:02:49
【问题描述】:

我们有一个最小的“更新程序”exe,它检查远程 URL 是否有更新、下载它们并在启动真正的应用程序之前替换磁盘上的文件。但是,如果我们想替换更新程序 EXE,那么 AFAIK 我们有两个选择:

  1. Shadow Copying Assemblies 借此 .Net 将创建 EXE(以及任何引用的程序集)的影子副本并加载这些程序集,以便可以替换非影子程序集并在下一个应用程序时使用启动。

  2. 确定哪些文件被替换并在磁盘上重命名/移动它们。 Windows 似乎允许重命名/移动锁定的文件,所以我们可以移动文件并复制到新的程序集中。同样,在下次启动应用程序时,我们将启动新程序集。这个方法有提到here

第二种方法是推荐的方法吗?这种方法有什么缺陷吗?

【问题讨论】:

    标签: .net shadow-copy


    【解决方案1】:

    另一种选择:当主应用程序想要更新自己时,它会产生一个新的更新程序进程,然后关闭自己。与此同时,生成的进程等待主应用程序关闭(进程消失),然后更新所有必要的文件(包括 .exe)。之后,它只是重新启动主应用程序并退出更新程序。

    【讨论】:

    • @jpierson 并且它有效:)。我在自己的应用程序中使用这种方法已有 2 年了。
    【解决方案2】:

    我使用第二种方法没有任何问题。只需确保正确下载了下载的程序集。 ;)

    运行 Update.exe 并让它这样做:

    1. 下载新的update.exe为update.ex_
    2. 将update.exe重命名为update.bak(可以重命名,但不能覆盖)
    3. 将update.ex_重命名为update.exe
    4. 重启update.exe

    我这样做完全没有问题,因此它在我们所说的大约 400 名客户中经过测试并在实时环境中运行。

    【讨论】:

    • 如何重新启动当前正在运行的程序?有没有简单的方法?
    • @chilitom : process.start (Application.StartupPath & "\myprogram.exe") :end
    【解决方案3】:

    ClickOnce 部署呢?

    【讨论】:

    • 这可能是最好的选择,因为它应该有助于标准化 Windows Vista 和未来版本的 Windows 中所需的安全级别升级/降级
    • 我们暂时不使用 ClickOnce,因为使用我描述的文件复制方法更容易,而且我们还为与应用程序一起安装的 SQL 数据库提供了定制的更新过程。但是 ClickOnce 是 Microsoft 的官方解决方案,我们将进一步研究以供将来使用,因此我选择它作为公认的答案。谢谢。
    • ClickOnce 是一场噩梦,因为它不灵活、过于复杂、似乎没有强大的 Microsoft 支持,并且非常特定于每个用户的部署方案。
    【解决方案4】:

    在我从事的一个项目中,有 2 个可执行文件。我们称它们为 A 和 B。

    A 存在的唯一原因是启动 B。 因此,当 B(“真正的”应用程序)下载更新时,它可以在必要时替换 A。

    如果应用程序重新启动(通过 A),A 检查 B 是否在启动 B 之前下载了一些文件并替换了它们。

    【讨论】:

    • 最近我偶然发现了一个正在运行的可执行文件不能被覆盖但可以重命名的事实。我已经在一个测试应用程序中亲自尝试过了,我将使用这种技术来开发我自己的应用程序自我更新器组件。
    • 查看卷影复制 (msdn.microsoft.com/en-us/library/ms404279.aspx)。我们使用它来允许终端服务器上的客户端更新客户端软件,而其他用户同时在同一台机器上运行应用程序。
    【解决方案5】:

    我们使用内部应用程序的方式:

    应用程序快捷方式指向更新程序。

    1. 显示停机通知/截止日期消息。
    2. 更新程序执行更新检查。
    3. 已下载并安装更新。
    4. 应用程序已启动。
    5. 应用程序执行更新程序的更新(检查 /update 文件夹中的 Updater.fp7.gz)

    编辑:糟糕 - 错过了第 5 步。

    【讨论】:

    • 你没看错吧?您如何在您的场景中更新更新程序本身?
    【解决方案6】:

    我基本同意Stefan's Answer,除了如果您想在 Windows Vista 或 Windows 7 上正确处理 UAC 并且您的应用程序正确安装在 Program Files 文件夹下或需要安装其他依赖项,它可能无法正常工作需要提升权限。

    在这种情况下,您要么执行基于 msi 的安装/补丁,要么安装以必要的安全性运行的 Windows 服务,以覆盖 Program Files 文件夹中的文件。

    如果您的应用程序是交互式的,另一个选项是按照 Igor Brejc 的建议进行操作,并生成一个执行更新的新进程,这使您的应用程序有机会在更新期间提示提升权限。使用上面提到的补丁或 Windows 服务选项可以提供更好的用户体验,无论场景如何(交互式/非交互式)。

    【讨论】:

      猜你喜欢
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 2017-11-05
      • 2010-10-01
      • 1970-01-01
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多