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

时间:2009-07-31 11:02:50

标签: .net shadow-copy

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

  1. Shadow Copying Assemblies其中.Net将创建EXE(以及任何引用的程序集)的卷影副本并加载这些程序集,以便可以替换非卷影程序集并在应用程序时使用下次推出。

  2. 确定要替换的文件,并在磁盘上重命名/移动它们。 Windows似乎允许重命名/移动锁定的文件,因此我们可以移动文件并复制新的程序集。再次,在下一次启动应用程序时,我们将启动新的程序集。提到了这种方法here

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

6 个答案:

答案 0 :(得分:8)

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

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

  1. 将新的update.exe下载为update.ex_
  2. 将update.exe重命名为update.bak(您可以重命名,但不能覆盖它)
  3. 将update.ex_重命名为update.exe
  4. 重新启动update.exe
  5. 我这样做完全没有任何问题,因此经过测试,并且正如我们所说,在大约400名客户的现场环境中运行。

答案 1 :(得分:7)

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

答案 2 :(得分:6)

ClickOnce部署怎么样?

答案 3 :(得分:3)

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

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

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

答案 4 :(得分:1)

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

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

  1. 显示停机通知/截止日期消息。
  2. 更新程序执行更新检查。
  3. 下载并安装更新。
  4. 推出应用程序。
  5. 应用程序执行更新程序的更新(检查/ update文件夹中的Updater.fp7.gz)
  6. 编辑:哎呀 - 错过了第5步。

答案 5 :(得分:0)

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

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

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