【问题标题】:Is manually (and silently) updating a ClickOnce app going to be a stable way of deploying updates?手动(静默)更新 ClickOnce 应用程序是否会成为部署更新的稳定方式?
【发布时间】:2011-07-25 00:03:39
【问题描述】:

我在公司网络中部署了一个应用程序,我希望更新过程不需要用户关注,类似于 Google Chrome 在后台安装更新的方式。我不需要让用户选择更新。

我使用System.Deployment 库来检测新的 ClickOnce 更新何时可用并自动安装它们。我想知道更新完成后是否需要重新启动应用程序。目前我在更新脚本结束时调用Application.Restart()

但是如果(为了使更新过程对用户更透明)我执行了“静默”异步更新,然后显示一个图标提示用户重新启动应用程序以应用更改,该怎么办?这会使应用程序不稳定吗?

此外,如果我在计时器上运行我的自定义 InstallUpdate() 进程,比如每 30 分钟一次,即使用户没有重新启动,ClickOnce 是否会稳定地继续更新每个发布的新版本(nb:我我希望更新仅在用户重新启动应用后应用)?

【问题讨论】:

  • 你试过这些吗?
  • 是的,但您尝试了吗? IE。使用 Click-once 编写一个程序,而不是重新启动应用程序,只是默默地更新它,然后更新它几次,然后手动重新启动它。这很容易告诉你这是否可行。
  • 还没有,但今天会测试。我希望有人能告知这是否会使应用程序不稳定?
  • 只是尝试并看到它的工作,这根本不能保证没有失败的场景等待。

标签: vb.net clickonce


【解决方案1】:

我认为这取决于您的应用程序在启动时执行的操作、安装更新和重新启动应用程序时执行的操作以及更新包含的内容。您可以尝试运行它,然后将调试器附加到它,看看它在做什么以及它有什么影响。

例如,我们的应用程序在启动时会将大量信息加载到内存中。如果更新包括对其中一种数据结构的更改,并且应用程序由于某种原因没有重新加载数据,则会导致问题。

【讨论】:

  • 如果你不重启,我猜当前运行的代码没有改变,所以我猜不会有数据结构问题。除非应用程序正在与可能以意外格式发送信息的其他(Web 服务、服务器等)通信,或者如果您加载了一些可能已更新的数据。
  • @Julien,是的,您需要在这些情况下同时更新客户端和服务器,或者确保服务器上的更改与仍在运行的旧版本客户端保持兼容。
【解决方案2】:

在这样做了几年之后,我们发现以这种方式静默安装更新是可能的。但是有几个问题需要注意:

  1. 如果线程在Update() 期间提前终止(例如:用户在更新过程中退出应用程序),安装将损坏,并且下次用户加载应用程序时, ClickOnce 正常部署将启动并重新安装应用程序。

  2. 用户的桌面图标总是在安装更新后重绘(闪烁)。

  3. 调用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
    
  4. 如果您的 ClickOnce 项目是 32 位,并且您在 x64 平台上运行它,那么在执行手动 ClickOnce 更新后,您的应用程序所具有的任何文件关联都将中断。有关详细信息,请参阅此MS support case

【讨论】:

  • 在大约 10 个用户的生产环境中以这种方式安装更新 2 个月后,我只注意到两个副作用:1) Windows 桌面将在更新后重绘进程已完成(明显闪烁和图标重绘),并且 2) 当用户随后单击调用 Application.Restart() 的“应用并重新启动”按钮时,应用程序有时会崩溃i>,但是这可能与安装更新无关,我不知道...
  • 更新:桌面重绘可能是由于 ClickOnce 删除并重新创建了应用程序的桌面快捷方式。
  • 关于副作用 2),至少在 Windows 窗体中,如果您在调用 Application.Restart 后打开表单(在我的情况下,打开一个表单在 FormClosing 事件处理程序中触发了InvalidOperationException)——用MessageBox.Show 显示消息框似乎是安全的。有关更多信息,请查看 Windows 窗体论坛中的 discussion(尤其是最后一篇文章)。
  • @edymtt,是的,我们遇到的崩溃可能与我认为的“静默”安装更新无关,而是取决于应用程序如何关闭(处理对象/线程)致电Application.Restart()。从那以后,我更改了代码来解决这个问题,我们再也没有遇到这种崩溃了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多