fVB.NET Центр обновления Windows аварийно завершает работу после завершения установки обновлений

В редких случаях моя программа вылетает после установки обновлений. Он просто выдает ошибку: «Имя программы перестало отвечать» и вылетает. Я знаю, что это должно быть что-то где-то в методе установки моей установки обновления Windows, но я не могу понять, что и где ошибка.

Может быть, кто-то, кто немного больше знает о WUAPI.dll, может мне помочь?

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

#Region "Installation method"
    Public Sub iInstallation()

        Progression = "UpdateInstall"
        iUpdateInstaller = TryCast(UpdateSession.CreateUpdateInstaller(), IUpdateInstaller)
        iUpdateInstaller.Updates = NewUpdatesCollection

        iInstallationJob = iUpdateInstaller.BeginInstall(New iUpdateInstaller_onProgressChanged(Me), New iUpdateInstaller_onCompleted(Me), New iUpdateInstaller_state(Me))
    End Sub
    Public Sub iInstallationComplete()
        Try
            Progression = "InstallComplete"
            iDownloadJob.CleanUp()
            iInstallationResult = iUpdateInstaller.EndInstall(iInstallationJob)
            InvokeUIChangeText = "Installation Complete..."
            InvokeUIChange()

            If iInstallationResult.ResultCode = OperationResultCode.orcSucceeded Or iInstallationResult.ResultCode = OperationResultCode.orcSucceededWithErrors Then

                    message = "Installation done. " & iInstallationJob.Updates.Count & " Updates installed"
                    caption = "Installation Successfull"
                    buttons = MessageBoxButtons.OK
                    ikon = MessageBoxIcon.Information
                    MessageBox.Show(message, caption, buttons, ikon)
                    Me.Close()


            Else

                message = "One or more installations failed to install."
                caption = "Installation failure"
                buttons = MessageBoxButtons.OK
                ikon = MessageBoxIcon.[Error]
                MessageBox.Show(message, caption, buttons, ikon)
                Me.Close()


            End If
        Catch err As Exception
            MsgBox(err.Message)
        End Try
    End Sub
    Public Class iUpdateInstaller_onProgressChanged
        Implements IInstallationProgressChangedCallback
        Private form1 As WUAPIProgress

        Public Sub New(mainForm As WUAPIProgress)
            Me.form1 = mainForm
        End Sub

        Public Sub Invoke(installationJob As IInstallationJob, e As IInstallationProgressChangedCallbackArgs) Implements IInstallationProgressChangedCallback.Invoke
            Dim x As Integer = e.Progress.CurrentUpdatePercentComplete
            form1.Invoke(Sub()

                             form1.Action.Text = "Installere opdatering " & e.Progress.CurrentUpdateIndex + 1 & "/" & installationJob.Updates.Count & " " & installationJob.Updates.Item(e.Progress.CurrentUpdateIndex + 1).Title
                             form1.ProgressBar1.Value = x
                             form1.Refresh()

                         End Sub)
        End Sub
    End Class
    Public Class iUpdateInstaller_onCompleted
        Implements IInstallationCompletedCallback

        Private form1 As WUAPIProgress

        Public Sub New(mainForm As WUAPIProgress)
            Me.form1 = mainForm
        End Sub

        Public Sub Invoke(installationJob As WUApiLib.IInstallationJob, callbackArgs As IInstallationCompletedCallbackArgs) Implements IInstallationCompletedCallback.Invoke
            form1.iInstallationComplete()
        End Sub
    End Class

    Public Class iUpdateInstaller_state
        Private form1 As WUAPIProgress

        Public Sub New(mainForm As WUAPIProgress)
            Me.form1 = mainForm
            msgbox("Starting installation")
        End Sub
    End Class
#End Region

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

Private Sub WUAPIProgress_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    Try


        Dim AutoUpdate = My.Computer.Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\", True)
        AutoUpdate.SetValue("AUOptions", 4)
        If Progression = "UpdateSearch" Or Progression = "SearchComplete" Then


            iSearchJob.RequestAbort()


        ElseIf Progression = "UpdateDownload" Or Progression = "UpdateComplete" Then
            iDownloadJob.RequestAbort()



        ElseIf Progression = "UpdateInstall" Or Progression = "InstallComplete" Then


            iInstallationJob.RequestAbort()

        End If



    Catch err As Exception
        MsgBox(err.Message)
    End Try
End Sub

И:

Private Sub WUAPIProgress_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed
    Me.Dispose()
End Sub

Думал, что у меня были какие-то ошибки, но, к сожалению, нет. Это было связано с чем-то другим.

Редактировать:

Перехват кода глобально:

Namespace My

' The following events are available for MyApplication:
' 
' Startup: Raised when the application starts, before the startup form is created.
' Shutdown: Raised after all application forms are closed.  This event is not raised if the application terminates abnormally.
' UnhandledException: Raised if the application encounters an unhandled exception.
' StartupNextInstance: Raised when launching a single-instance application and the application is already active. 
' NetworkAvailabilityChanged: Raised when the network connection is connected or disconnected.
Partial Friend Class MyApplication

    Private Delegate Sub SafeApplicationThreadException(ByVal sender As Object, ByVal e As Threading.ThreadExceptionEventArgs)

    Private Sub ShowDebugOutput(ByVal ex As Exception)

        Dim frmD As New frmDebug()
        frmD.rtfError.AppendText(ex.ToString())
        frmD.ShowDialog()

        Environment.Exit(0)

    End Sub

    Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup


        AddHandler System.Windows.Forms.Application.ThreadException, AddressOf app_ThreadException


        AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf AppDomain_UnhandledException
    End Sub

    Private Sub app_ThreadException(ByVal sender As Object, ByVal e As Threading.ThreadExceptionEventArgs)


        If MainForm.InvokeRequired Then

            MainForm.Invoke(New SafeApplicationThreadException(AddressOf app_ThreadException), New Object() {sender, e})
        Else
            ShowDebugOutput(e.Exception)
        End If

    End Sub

    Private Sub AppDomain_UnhandledException(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)

        ShowDebugOutput(DirectCast(e.ExceptionObject, Exception))

    End Sub

    Private Sub MyApplication_UnhandledException(sender As Object, e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException

        ShowDebugOutput(e.Exception)

    End Sub

End Class


End Namespace

Редактировать:

Я проследил, что может быть основной проблемой.

Программа запускается с USB-накопителя, и если этот USB-накопитель будет удален до завершения работы программы, она по какой-либо причине попытается добраться до места, откуда было запущено приложение (на USB-накопителе), и затем произойдет сбой. и сбои.

Так что, похоже, мне придется скопировать саму программу, а затем запустить ее из места на компьютере. Что странно, однако, это то, что это не всегда проблема. Но на виртуальных машинах под управлением Windows 8.1 я наблюдаю это почти каждый раз.

Думаю, я поиграюсь с этим еще немного, так как я бы предпочел, чтобы у меня была возможность извлечь USB-накопитель после запуска программы. Меня озадачивает, почему у нее должен быть доступ к .exe, чтобы закончить вверх?


person Gematria    schedule 23.04.2015    source источник
comment
Сбой не является подходящим описанием проблемы. Вы должны написать обработчик событий для события AppDomain.CurrentDomain.UnhandledException, чтобы можно было диагностировать необработанные исключения. Опубликуйте сообщение об исключении и трассировку стека, теперь вам нужна помощь здесь.   -  person Hans Passant    schedule 23.04.2015
comment
Ах хорошо .. Спасибо. Я посмотрю на это :) Это также поймает, что программа перестала отвечать и должно быть закрыто диалоговое окно? Или это диалоговое окно является прямым результатом исключения, происходящего вне потока, что означает, что вы не получите обычный диалог необработанного исключения?   -  person Gematria    schedule 23.04.2015
comment
Да, вы вызываете Environment.Exit() в обработчике событий после отображения или регистрации исключения, чтобы этот диалог WER не отображался.   -  person Hans Passant    schedule 23.04.2015
comment
Я поработаю над тем, чтобы исправить это и получить некоторые данные. Просто возникли некоторые трудности с глобальным, но это уже другой вопрос :) Спасибо, что указали мне правильное направление.   -  person Gematria    schedule 23.04.2015
comment
Получил немного данных из-за ошибки, которую он выдает.   -  person Gematria    schedule 27.04.2015
comment
Спасибо, что предоставили нам информацию об ошибке. Какая строка вызывает ошибку?   -  person Jeremy Thompson    schedule 27.04.2015
comment
Хотел бы я знать .. Это настолько редко, что у меня возникают трудности с его отладкой. И мой перехват ошибок по какой-то причине не отображает номер строки во время этого исключения, в то время как для большинства других исключений.   -  person Gematria    schedule 27.04.2015
comment
Добавьте трассировку, возможно, используя библиотеку AOP Postsharp, чтобы узнать стек вызовов, по крайней мере, тогда вы можете сузить номер строки в последней вызванной функции и не использовать ShowDialog, чтобы показать ошибку, просто используйте файл журнала.   -  person Jeremy Thompson    schedule 28.04.2015
comment
Итак, я нашел проблему. К сожалению, это произошло из-за моей глупости. У меня было несколько BGW, которые запускали для меня функцию тайм-аута, и именно эта функция тайм-аута по какой-то причине случайным образом терпела неудачу, что заканчивалось сбоем программы.   -  person Gematria    schedule 02.05.2015


Ответы (1)


Не должно возникнуть проблем с тем, чтобы сделать его глобальным, просто используйте этот код:

Public Shared Sub Main(args As String())
    AppDomain.CurrentDomain.UnhandledException += New UnhandledExceptionEventHandler(AddressOf ApplicationUnhandledException)
End Sub

Private Sub ApplicationUnhandledException(sender As Object, e As UnhandledExceptionEventArgs)
        'Write all the information to help diagnose the problem
End Sub

Затем предоставьте Гансу и/или мне информацию.

person Jeremy Thompson    schedule 27.04.2015
comment
Это в начальном вопросе. Это результат, который я могу получить от него в любом случае. Код, который я ловлю в applicationevents.vb, тоже есть в начальном вопросе. - person Gematria; 27.04.2015