我需要快速而肮脏地升级我的应用程序。
目前我每次发布都有一个exe。
如果exe错了,我会弹出一条消息“在db上找到X,你正在使用exe发布Y,请下载正确的vetsion”。
我的每个exe都有一个固定的地址,例如:
http://myip.com/exes/N/Project.exe
(其中N是重新发布的)
所以我的想法是代替上面的消息,我会提示用户“将下载正确的exe,按ok继续”。
我的想法是在OK之后:
1)运行ShellExecute
另一个exe(让我们调用id Update.exe)来处理downlaod和replace(这个exe可以存储在exe资源中)
2)关闭应用程序
2)Update.exe将从互联网上下载正确的exe并将其保存到临时文件夹
4)Update.exe将删除Project.exe并将其替换为下载的
5)Update.exe将运行新的Project.exe
因此将运行corret exe并且用户将新exe与旧exe相同的位置。这将是一个非常规的升级(不使用Windos更新,但相信我,我需要这个。我不会更新WIndows)。
你能对这种方法发表评论吗?或者提出类似的伎俩?
答案 0 :(得分:4)
我会采取略有不同的方法。我没有使用单独的exe进行下载,而是让主exe在后台线程中执行,或使用Windows BITS服务(接受HTTP URL)。这样,应用程序可以在下载过程中保持运行,并且可以在用户闲暇时重新启动。每当启动主exe时,它都可以检查temp文件夹中是否存在已完成的更新文件,如果找到则提取加载器exe,运行它并退出。加载器然后等待主exe完成退出,移动/重命名更新文件,然后运行它。
答案 1 :(得分:3)
我这样做,对我来说效果很好:
OK之后,这在UpdateOKClick中完成:
程序立即终止,并且安装有一点延迟,所以它在程序关闭后启动。用户将看到Inno Setup显示的安装进度屏幕,但由于这两个参数,它不会询问任何问题。
Inno Setup安装的最后一步是启动程序。它使用/ webupdate参数调用它。
启动程序时,它会检查是否使用了webupdate参数。如果是这样,它会对新版本进行任何初始化,然后显示一个消息框,说明"程序现在更新为版本xxx"。
在此过程中会有很多检查和可能的消息,包括让用户随时取消选项,但基本上就是这样。
...而且我不必删除以前的可执行文件。它只会被覆盖。如果用户打开了第二个程序实例,那将会失败,但这是另一件需要检查的事情。
答案 2 :(得分:2)
以下是我用于本地内部应用程序的方法。它依赖于您可以在应用程序运行时重命名* .exe文件的事实。
updater类下载包含更新信息的XML文件。它将该信息与当前运行的应用程序进行比较。如果需要更新,它会下载更新的文件(基本上是文件副本,因为它们位于本地服务器上)并添加.update扩展名。然后通过添加.bak扩展名重命名当前正在运行的exe。然后将下载的文件重命名为原始exe名称,然后重新启动应用程序。
这只是一个快速概述。有检查可以解决错误或问题,以及提示用户。还有清理代码可以删除旧备份等,或者在必要时回滚到以前的版本。在某些情况下,您可以在启动时通过执行上述操作来强制执行更新,而无需用户交互。
虽然可能不是最好的方法,但它在我们的本地局域网上运行良好。
答案 3 :(得分:1)
还有另一种方法,因为无论如何你要重写文件结构: 让一个小的存根程序进行版本检查,提示(并执行)更新,然后启动实际的应用程序。
答案 4 :(得分:0)
我一直在做什么,如果只更新涉及main-exe:
我的exe文件(在这种情况下,是新的)将以特殊的“更新”模式启动,等待它应该替换为退出的exe,然后复制自身并覆盖它,运行新的exe和退出。
要删除下载的更新,可以使用-doneupdating -c:\ tempdownloadlocation等一些参数调用新的exe,然后exe可以删除。
这种方法维护起来非常简单,因为所有内容都包含在主exe中,并且可以轻松扩展以处理额外的文件