Надежный способ автоматического обновления развернутого в сети приложения Click-Once - PullRequest
0 голосов
/ 27 сентября 2018

Я работаю над этим уже несколько месяцев без реального успеха.Я собрал воедино код из разных источников, и это то, что у меня есть.

Иногда оно работает как положено, иногда приложение просто зависает, а иногда обновляется 4 раза.

У меня есть таймеринтервал в 5 минут, который проверяет, доступно ли обновление и есть ли Обновления и перезапуски.Простое право?

Приложение развернуто по сети, и иногда пользователи оставляют приложение работающим неделями, не выходя из системы.При публикации обновления они могут получить ошибки из-за новых функций или изменений в базе данных.

Почему такие разные результаты?

Вот событие загрузки формы ...

Me.Timer2.Interval = 300000 Me.Timer2.Start()

Вот событие Timer_Tick ...

 Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick

    If CheckForUpdateDue() Then
        My.Forms.PopupLoading.Show()
        My.Forms.PopupLoading.Label1.Text = "Project is Updating Please Wait..."
        My.Forms.PopupLoading.Refresh()
        Dim ad As ApplicationDeployment = ApplicationDeployment.CurrentDeployment
        ad.Update()
        My.Settings.Save()
        My.Forms.PopupLoading.Close()
        My.Forms.Popup_Restarting.Show()
        Application.Restart()
    End If

End Sub

Вот функция CheckForUpdateDue ...

 Private Function CheckForUpdateDue() As Boolean
    Dim isUpdateDue As Boolean = False
    If ApplicationDeployment.IsNetworkDeployed Then
        Dim AD As ApplicationDeployment = ApplicationDeployment.CurrentDeployment
        If AD.CheckForUpdate() Then
            isUpdateDue = True
        End If
    End If
    CheckForUpdateDue = isUpdateDue
End Function

Настройки приложения

Настройки обновления приложения

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Это то, что я закончил ...

 Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Dim ct As Date = DateTime.Now
    If ct.Hour = 22 Then
        Dim info As UpdateCheckInfo = Nothing

        If ApplicationDeployment.IsNetworkDeployed Then
            Dim AD As ApplicationDeployment = ApplicationDeployment.CurrentDeployment

            Try
                info = AD.CheckForDetailedUpdate()
            Catch dde As DeploymentDownloadException
                MessageBox.Show("The new version of the application cannot be downloaded at this time. " & ControlChars.Lf & ControlChars.Lf & "Please check your network connection, or try again later. Error: " + dde.Message)
                Return
            Catch ioe As InvalidOperationException
                MessageBox.Show("This application cannot be updated. It is likely not a ClickOnce application. Error: " & ioe.Message)
                Return
            End Try

            If info.UpdateAvailable Then
                Dim doUpdate As Boolean = True

                If doUpdate Then
                    Try
                        'restart application first
                        Application.Restart()
                        'then do update
                        AD.Update()
                        'when the application is restarted again it will be update
                    Catch dde As DeploymentDownloadException
                        MessageBox.Show("Cannot install the latest version of the application. " & ControlChars.Lf & ControlChars.Lf & "Please check your network connection, or try again later.")
                        Return
                    End Try
                End If
            End If
        End If
    End If

End Sub

взято из Документы Microsoft VS , кажется, работает, подождет и увидит .....

0 голосов
/ 28 сентября 2018

Похоже, My.Application.Deployment.CheckForUpdate() это путь.Он проверяет UpdateLocation, чтобы узнать, доступно ли обновление, и просит пользователя загрузить его, или вы можете принудительно установить обновление без вывода сообщений, нажав My.Application.Deployment.CheckForUpdate(true).

Я попытался использовать это в своем проекте в режиме отладки, и он выдал InvalidDeploymentException, но я думаю, что он должен работать в рабочем коде с развертыванием Click-Once

...