我们有一个最小的'updater'exe,用于检查远程URL以获取更新,下载它们并在启动实际应用程序之前替换磁盘上的文件。但是,如果我们想要更换更新程序EXE,那么AFAIK我们有两个选择:
这第二种方法是推荐的方法吗?这种方法有什么缺陷吗?
那么ClickOnce部署呢?
我使用第二种方法没有任何问题。只需确保下载的程序集已正确下载。 ;)
运行Update.exe并让它执行此操作:
我这样做完全没有任何问题,所以我们测试并在我们说话时在大约400名客户的现场环境中运行。
另一种选择:当主应用程序想要自我更新时,它会生成一个新的更新程序进程,然后自行关闭。同时生成的进程等待主应用程序关闭(进程消失),然后更新所有必需的文件(包括.exe)。之后,它只是重新启动主应用程序并退出更新程序进程。
在我工作的项目中,有2个可执行文件。我们称他们为A和B.
A存在的唯一原因是启动B.因此,当B(“真正的”应用程序)下载更新时,它能够替换A(如果需要)。
如果应用程序重新启动(通过A),A检查B是否下载了一些文件并在它们启动之前替换它们。
我们使用内部应用程序的方式:
应用程序快捷方式指向更新程序。
编辑:哎呀 - 错过了第5步。
我主要同意Stefan's Answer,除非你想在Windows Vista或Windows 7上正确处理UAC并且你的应用程序正确安装在Program Files文件夹下,或者需要安装需要提升权限的其他依赖项,否则它可能无效。
在这种情况下,您要么执行基于msi的安装/修补程序,要么安装运行时具有必要安全性的Windows服务来覆盖Program Files文件夹中的文件。
如果您的应用程序是交互式的另一个选项是按照Igor Brejc的建议进行操作,并生成一个执行更新的新进程,使您的应用程序有机会在更新期间提示提升权限。使用上面提到的补丁或Windows服务选项可以提供更好的用户体验,无论场景如何(交互/非交互)。