实现自我更新软件的最佳方法

问题描述 投票:11回答:6

我们有一个最小的'updater'exe,用于检查远程URL以获取更新,下载它们并在启动实际应用程序之前替换磁盘上的文件。但是,如果我们想要更换更新程序EXE,那么AFAIK我们有两个选择:

  1. Shadow Copying Assemblies,其中.Net将创建EXE(以及任何引用的程序集)的卷影副本并加载这些程序集,以便可以替换非卷影程序集,并在下次启动应用程序时使用。
  2. 确定要替换的文件,并在磁盘上重命名/移动它们。 Windows似乎允许重命名/移动锁定的文件,因此我们可以移动文件并复制新的程序集。再次,在下一次启动应用程序时,我们将启动新的程序集。这种方法被提及here

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

.net shadow-copy
6个回答
6
投票

那么ClickOnce部署呢?


8
投票

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

运行Update.exe并让它执行此操作:

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

我这样做完全没有任何问题,所以我们测试并在我们说话时在大约400名客户的现场环境中运行。


7
投票

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


3
投票

在我工作的项目中,有2个可执行文件。我们称他们为A和B.

A存在的唯一原因是启动B.因此,当B(“真正的”应用程序)下载更新时,它能够替换A(如果需要)。

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


1
投票

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

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

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

编辑:哎呀 - 错过了第5步。


0
投票

我主要同意Stefan's Answer,除非你想在Windows Vista或Windows 7上正确处理UAC并且你的应用程序正确安装在Program Files文件夹下,或者需要安装需要提升权限的其他依赖项,否则它可能无效。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.