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