如何实现自动更新检测模型

我们的软件并没有正式安装在Windows上,目前有一个像这样的更新模式:

  1. 连接到互联网

  2. 点击更新button

  3. 连接到服务器端程序

  4. 服务器端程序创build服务器程序目录中所有文件的md5哈希列表。

  5. 客户端程序创build客户端程序目录中所有文件的md5哈希列表。

  6. 进行比较以查看文件是否需要更新,删除或添加到客户端计算机,直到完成。

那么,我想转移到一个模型,我发现这些日子里使用更频繁的软件正式安装,发生这样的事情:

  1. 当检测到互联网连接时,程序将自动查询服务器以查看是否有更新的安装包。

  2. 如果是,请询问用户是否要下载新安装。

  3. 如果不是,则什么也不做,如果是,请下载新安装。

  4. 以编程方式卸载旧的程序并开始安装新的软件包。

我需要build议的部分是上面的4号。 在运行原始程序的同时,以编程方式卸载旧程序并开始安装新程序的最佳方法是什么? 我假设必须有一些中介程序来完成所有的工作(closures当前的程序,运行卸载程序,然后启动新的安装程序)还有更好的方法吗? 我只是想转移到一个模型,我们更新完整的安装,而不仅仅是文件 – 这将允许我们更容易版本的软件,并保持独立的安装,以恢复到任何时候。

谢谢你的build议!

编辑:相关的问题 – 什么是最简单的方法来find特定安装的安装UUID?

我做的方式是有一个单独的程序(我们称之为StartUp.exe),检查更新,然后加载真正的软件(我们称之为Program.exe)。 StartUp.exe与Program.exe具有相同的图标,并且是桌面快捷方式和菜单项指向的可执行文件,使用与Program.exe相同的名称。

所以顺序是这样的:

  1. 用户双击桌面快捷方式或菜单项看起来像Program.exe并被称为相同的名称,但实际上是StartUp.exe
  2. StartUp.exe运行并检查是否有任何更新
  3. 如果有更新,它只是复制然后跨越(我们建立了一个很好的系统与进度条,但你可以简单地复制新的文件在旧文件)
  4. StartUp.exe然后运行Program.exe
  5. StartUp.exe然后退出

这样做的好处是你的程序文件没有被锁定,因为装载程序实际上是一个不同的程序。 用户并不聪明,因为他们运行的程序看起来像和他们想要运行的程序一样,最终的结果是他们想要的程序运行,并保证是最新的版本。

使用更新按钮做更复杂,但我们需要强制最新版本的程序运行(由于版本之间的数据库差异),所以迫使更新启动为我们工作。

我相信现在这样做的方法是使用ClickOnce部署,但我从来没有尝试过 – 当我编写我的系统时,这是不可用的,这种方法很简单,运行良好。