我在企业网络中部署了一个应用程序,我希望更新过程在后台需要较少的用户关注,类似于Google Chrome安装更新的方式。我不需要让用户选择更新。
我已使用System.Deployment
库检测新的ClickOnce更新何时可用并自动安装。我想知道在更新完成后是否有必要重新启动应用程序。目前,我在更新脚本的末尾调用Application.Restart()
。
但是如果(为了使更新过程对用户更加透明)我执行了“静默”异步更新,然后显示一个图标,提示用户重新启动应用程序以应用更改?这会以任何方式使应用程序不稳定吗?
此外,如果我在计时器上运行我的自定义InstallUpdate()
进程,比如说每30分钟一次,那么即使用户没有重新启动,ClickOnce也会保持稳定以继续更新已发布的每个新版本(nb:我希望只有在用户重新启动应用程序后才会应用更新?
答案 0 :(得分:1)
经过几年的这样做,我们发现可以通过这种方式静默安装更新。但是有一些问题需要注意:
如果线程在Update()
期间过早终止(例如:用户在更新过程中退出应用程序),则安装将损坏,并在用户下次加载应用程序时,ClickOnce正常部署将启动并重新安装该应用程序。
安装更新后,用户的桌面图标始终会重绘(闪烁)。
调用ApplicationDeployment.CurrentDeployment.CheckForUpdate()
次超过65536次会导致System.NullReferenceException
Source。
另一种方法是不实际检查更新,我发现这会锁定我的一个dll并阻止加载表单,所以要小心使用:
If ApplicationDeployment.CurrentDeployment.Update Then ' update app
console.writeline("update installed")
' code to inform user update was sucessfull and they need to restart
End If
如果您的ClickOnce项目是32位,并且您在x64平台上运行它,则在执行手动ClickOnce更新后,您的应用程序所具有的任何文件关联都将中断。有关详细信息,请参阅此MS support case。
答案 1 :(得分:1)
我认为这取决于您的应用程序在启动时所执行的操作,以及安装更新并重新启动应用程序时所执行的操作以及更新包含的内容。您可以尝试运行它,然后将调试器附加到它,看看它正在做什么以及它有什么影响。
例如,我们的应用程序在启动时会将大量信息加载到内存中。如果更新包含对其中一个数据结构的更改,并且应用程序由于某种原因未重新加载数据,则会导致问题。