Vb.net 手动(和静默)更新ClickOnce应用程序将是部署更新的一种稳定方式吗?

Vb.net 手动(和静默)更新ClickOnce应用程序将是部署更新的一种稳定方式吗?,vb.net,clickonce,Vb.net,Clickonce,我在公司网络中部署了一个应用程序,我希望更新过程不需要用户太多的关注,就像谷歌Chrome在后台安装更新一样。我不需要给用户更新的选择 我使用了System.Deployment库来检测新的ClickOnce更新何时可用,并自动安装它们。我想知道是否有必要在更新完成后重新启动应用程序。目前,我在更新脚本结束时调用了Application.Restart() 但如果(为了让更新过程对用户更透明)我执行了一个“静默”异步更新,然后显示一个图标,提示用户重新启动应用程序以应用更改,该怎么办?这会不会让

我在公司网络中部署了一个应用程序,我希望更新过程不需要用户太多的关注,就像谷歌Chrome在后台安装更新一样。我不需要给用户更新的选择

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

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


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

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

  • 如果线程在
    更新()
    过程中过早终止(例如:用户在更新过程中退出应用程序),则安装将损坏,用户下次加载应用程序时,ClickOnce正常部署将触发并重新安装应用程序

  • 安装更新后,用户的桌面图标始终会重新绘制(闪烁)

  • 调用
    ApplicationDeployment.CurrentDeployment.CheckForUpdate()
    超过65536次会导致
    System.NullReferenceException

    另一种方法是不实际检查更新,我发现这会锁定我的一个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更新后,您的应用程序的任何文件关联都将中断。有关更多详细信息,请参见此


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


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

    你试过这些吗?我能找到的唯一的参考资料是:是的,但是你试过了吗?例如,使用单击一次来编写程序,而不是重新启动应用程序,只是默默地更新它,然后更新几次,然后手动重新启动它。这将很容易告诉你这是否有效。还没有,但将在今天测试。我希望有人能告诉我这是否会使应用程序变得不稳定?仅仅通过尝试并看到它工作,这根本不能保证不会出现故障情况。如果不重新启动,我猜当前运行的代码没有更改,因此我猜不会有数据结构问题。除非应用程序正在与其他可能以意外格式发送信息的(web服务、服务器等)通信,或者加载了一些可能已更新的数据。@Julien,是的,在这些情况下,您需要同时更新客户端和服务器,或者确保服务器上的更改与仍在运行的客户端的旧版本保持兼容。在大约有10个用户的生产环境中以这种方式安装更新2个月后,我只注意到两个副作用:1)Windows桌面将在更新过程完成后重新绘制(明显的闪烁和图标重新绘制),2)当用户随后单击调用application.restart()的“应用并重新启动”按钮时,应用程序有时会崩溃,但这可能与安装更新无关,我不知道…更新:桌面重画可能是由于ClickOnce删除并重新创建应用程序的桌面快捷方式。关于副作用2),如果在调用
    应用程序后打开窗体,则至少在Windows窗体中可能会发生这种情况。重新启动
    (在我的情况下,在窗体关闭事件处理程序中打开窗体会触发
    InvalidOperationException
    )--使用
    MessageBox.show来显示消息框似乎是安全的。有关更多信息,请在Windows窗体论坛(尤其是最后一篇文章)中查看此内容。@edymtt,是的,我们遇到的崩溃可能与我所想的“静默”安装更新无关,而是取决于在调用
    application.Restart()
    时应用程序如何关闭(处理对象/线程)。从那以后,我修改了代码来修复这个问题,我们再也不会发生这种崩溃了!