none
sporadischer Fehler bei AutoUpdate-Prüfung einer ClickOnce-Anwendung RRS feed

  • Frage

  • Hallo,
    für eine ClickOnce-Anwendung habe ich eine AutoUpdate-Funktion eingebaut.

    Prinzipiell läuft diese, aber an einigen Clients (egal ob W2012, 2008, 2003) gibt es den Fehler: Für das Objekt wurde keine Objektinstanz festgelegt (so ähnlich jedenfalls), eine NullReferenceExecption also. Der Fehler tritt in Zeile 60 auf, wenn die Anfrage gestartet wird.
    Anbei der Code:

        Private Sub CheckForUpdate()
    10:     Dim info As UpdateCheckInfo = Nothing
    
    20:     Try
    30:         If (ApplicationDeployment.IsNetworkDeployed) Then
    40:             Dim AD As ApplicationDeployment = ApplicationDeployment.CurrentDeployment
    
    50:             Try
    60:                 info = AD.CheckForDetailedUpdate()
    70:             Catch dde As DeploymentDownloadException
    80:                 AddMsg("CheckForUpdate - Downloadfehler " & Err.Number & " in Zeile " & Err.Erl & ": " & dde.Message.ToString)
    90:                 Return
    100:            Catch ioe As InvalidOperationException
    110:                Return
    120:            Catch ex As Exception
    130:                Dim ErrMsg As String = "CheckForUpdate (ApplicationDeployment.IsNetworkDeployed) - Fehler in Zeile " & Err.Erl & ": " & ex.Message.ToString
    140:                AddMsg(ErrMsg)
                        Return
    150:            End Try
    
    160:            If (info.UpdateAvailable) Then
    170:                AddMsg("neue Version erkannt: " & info.AvailableVersion.ToString)
    180:                AD.Update()
    210:                Try
    250:                    AD.Update()
    260:                    Application.Restart()
    280:                Catch dde As DeploymentDownloadException
    290:                    AddMsg("Das aktuelle Update kann nicht installiert werden. Bitte Netzwerkverbindung prüfen.")
    300:                    Return
    310:                Catch ex As Exception
    320:                    Dim ErrMsg As String = "CheckForUpdate (info.UpdateAvailable) - Fehler in Zeile " & Err.Erl & ": " & ex.Message.ToString
    330:                    AddMsg(ErrMsg)
                            Return
    340:                End Try
    360:            End If
    370:        End If
    380:    Catch ex As Exception
    390:        Dim ErrMsg As String = "CheckForUpdate - Fehler " & Err.Number & " in Zeile " & Err.Erl & ": " & ex.Message.ToString
    400:        AddMsg(ErrMsg)
    410:    Finally
    420:        blReady = True
    430:    End Try
    
        End Sub

    Das blöde ist eben, dass es lokal beim Debuggen immer funktioniert, ich also den Fehler nicht weiter Analysieren kann.

    Außerdem ist weiterhin merkwürdig, dass der Fehler erst nach einer gewissen Zeit auftritt. Die Prüfung findet alle 30 min statt. Kann es sein, dass sich evtl. die Clients, welche nach einem Update schauen, da irgendwie ins Gehege kommen?

    Hat evtl. jemand einen Ansatz, an was das liegen könnte?


    Viele Grüße, Volker





    • Bearbeitet Volker S Dienstag, 16. August 2016 08:18
    Dienstag, 16. August 2016 08:14

Antworten

  • Hallo Alexander,
    wie versprochen die Rückmeldung.

    Aufgrund deines Vorschlags hab ich es jetzt in dieser Art gemacht. Die Funktion CheckForUpdate stößt den Vorgang.

        Dim WithEvents ADLaunchAppUpdate As ApplicationDeployment

        Private Sub CheckForUpdate(Optional ByVal blManuell As Boolean = False)
    
    10:     Dim myDB As New dbMonitorEntities
    
    20:     Try
    30:         If (ApplicationDeployment.IsNetworkDeployed) Then
    40:             ADLaunchAppUpdate = ApplicationDeployment.CurrentDeployment
    50:             ADLaunchAppUpdate.CheckForUpdateAsync()
    60:         Else
    70:             AddMsg("Fehler in CheckForUpdate: keine ClickOnce-Anwendung!")
    80:         End If
    
    90:         Dim CLIENT = From c In myDB.tbl_CLIENT
                             Where c.BEZEICHNUNG.Equals(My.Computer.Name)
                             Select c
    
    
    100:        CLIENT.Single.C_VERSION = My.Application.Info.Version.ToString
    110:        myDB.SaveChanges()
    
    120:    Catch ex As Exception
    130:        AddMsg("Fehler in CheckForUpdate Zeile " & Err.Erl & ": " & ex.Message)
    140:        Application.Restart()
    150:    Finally
    160:        myDB.Dispose()
    170:        myDB = Nothing
    180:        lblLastUpdate.Text = "Udp. " & Now.ToString
    190:        If blManuell Then AddMsg("Updateprüfung beendet.")
    200:    End Try
    
        End Sub
    
        Private Sub ADLaunchAppUpdate_UpdateCompleted(sender As Object, e As AsyncCompletedEventArgs) Handles ADLaunchAppUpdate.UpdateCompleted
    10:     Try
    20:         Application.Restart()
    
    30:     Catch ex As Exception
    40:         AddMsg("Fehler in ADLaunchAppUpdate_UpdateCompleted Zeile " & Err.Erl & ": " & ex.Message)
    50:     End Try
        End Sub
    
        Private Sub ADLaunchAppUpdate_CheckForUpdateCompleted(sender As Object, e As CheckForUpdateCompletedEventArgs) Handles ADLaunchAppUpdate.CheckForUpdateCompleted
    10:     Try
    20:         If (e.UpdateAvailable) Then
    30:             BeginUpdate()
    40:         End If
    
    60:     Catch ex As Exception
    70:         AddMsg("Fehler in ADLaunchAppUpdate_CheckForUpdateCompleted Zeile " & Err.Erl & ": " & ex.Message)
    80:     End Try
        End Sub
    
        Private Sub BeginUpdate()
    10:     Try
    20:         ADLaunchAppUpdate = ApplicationDeployment.CurrentDeployment
    30:         ADLaunchAppUpdate.UpdateAsync()
    
    40:     Catch ex As Exception
    50:         AddMsg("Fehler in BeginUpdate Zeile " & Err.Erl & ": " & ex.Message)
    60:         Application.Restart()
    70:     End Try
        End Sub

    
    

    Sollte es doch zu einem Fehler kommen, so wird die Anwendung neu gestartet.
    Bis jetzt war das allerdings nicht der Fall und es funktionierte bisher tadellos.

    Vielen Dank nochmals für die Unterstützung.


    Viele Grüße, Volker





    • Als Antwort markiert Volker S Montag, 12. September 2016 08:06
    • Bearbeitet Volker S Montag, 12. September 2016 08:08
    Montag, 12. September 2016 08:02

Alle Antworten

  • Hallo Volker,

    es scheint als würde es sich hierbei um einen BUG im ClickOnce handeln. Der Fehler tritt wohl erst nach einigen Aufrufen auf. 

    So nebenbei: Reicht der Updatecheck beim Start der Anwendung nicht aus?

    Dienstag, 16. August 2016 10:04
  • Hallo David,
    danke für den Link. Das beschreibt es ziemlich gut.

    So nebenbei: Reicht der Updatecheck beim Start der Anwendung nicht aus?

    Nee, leider nicht. Die Anwendung muss ab und an nachschauen, ob es ein Update gibt, da diese auf mehreren Servern läuft. Da ist es ganz praktisch, sonst muss jeder einzeln abgeklappert und der Neustart manuell angestoßen werden.

    Bis jetzt läuft es ca. 3 Tage und dann steigt es aus. Allerdings nicht auf jedem. Hmm.
    Zusätzlich werde ich mal probieren, im Fehlerfall die Anwendung neu zu starten. Mal gucken ob es klappt. Werde mich in ein paar Tagen oder auch vielleicht schon früher, mal melden. Je nach dem, wie es läuft.

    Jedenfalls erst einmal vielen Dank für dein Interesse.


    Viele Grüße, Volker


    • Bearbeitet Volker S Mittwoch, 17. August 2016 06:08
    Dienstag, 16. August 2016 11:55
  • Hallo Volker,
    Schau bitte mal auf dieses Code-Beispiel:
    https://msdn.microsoft.com/de-de/library/ms136934(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-2

    Das Beispiel geht von Events aus, eingeleitet mit  

    Dim WithEvents ADLaunchAppUpdate As ApplicationDeployment
    So ganz sicher bin ich mir um die Zeit nicht mehr, aber es sollte so sein das es nicht klappt wenn die Leitung zu langsam ist.

    HTH
    Grüße Alexander

    Dienstag, 16. August 2016 17:09
  • Hallo Alexander,
    vielen Dank für den Tipp.
    Ich denke, die Leitung kann ich ausschließen. Das läuft alles in einer VMWare-Umgebung. Außer, die Netzwerkverbindung würde unterbrochen werden. Aber das würde man spätestens an den Datenbankverbindungen merken.

    Aber eines musst du mir erklären: Wie schließt du von den Events auf ein mögliches Problem mit der Leitung?


    Viele Grüße, Volker


    • Bearbeitet Volker S Mittwoch, 17. August 2016 06:16
    Mittwoch, 17. August 2016 06:08
  • Hallo Volker, Ich habe mich hier extrem schlecht ausgedrückt.
    Gemeint war einfach das im Beispiel von MS das via Event abgefragt wurde.
    Bei deiner Schreibweise steckt drin das in Zeile 60 gleicher Zustand erreicht ist wie bei dem Beispiel von MS im
    Update_Completed Event. Hier unterstellte ich die Differenz, den Grund warum das nicht so ist, im Netz.
    Selbst das abfragen der Userrechte im AD wäre in diesem einfachen Sinne ein Netzwerkzugriff.
    Das war eine Fehlerquelle bei der Recherche nach diesem Fehler da angeblich ab und an die Dateirechte nicht "passten".

    Die Fehlermeldung "wurde keine Objektinstanz festgelegt (so ähnlich jedenfalls)" spricht aus meiner Sicht dafür das hier die von Dir verwendete Schreibweise  möglicherweise einfach nicht mehr passt und die im Beispiel gezeigte asynchrone Schreibweise zu prüfen sei.

    Mein Schritt wäre die von MS gezeigte Schreibweise aus dem Link zu nutzen.

    Grüße Alexander

    Mittwoch, 17. August 2016 08:25
  • Hallo Alexander,
    alles klar.

    Ich werde das mal auprobieren. Danke für den Tipp!


    Viele Grüße, Volker

    Mittwoch, 17. August 2016 08:59
  • Hallo Alexander,
    wie versprochen die Rückmeldung.

    Aufgrund deines Vorschlags hab ich es jetzt in dieser Art gemacht. Die Funktion CheckForUpdate stößt den Vorgang.

        Dim WithEvents ADLaunchAppUpdate As ApplicationDeployment

        Private Sub CheckForUpdate(Optional ByVal blManuell As Boolean = False)
    
    10:     Dim myDB As New dbMonitorEntities
    
    20:     Try
    30:         If (ApplicationDeployment.IsNetworkDeployed) Then
    40:             ADLaunchAppUpdate = ApplicationDeployment.CurrentDeployment
    50:             ADLaunchAppUpdate.CheckForUpdateAsync()
    60:         Else
    70:             AddMsg("Fehler in CheckForUpdate: keine ClickOnce-Anwendung!")
    80:         End If
    
    90:         Dim CLIENT = From c In myDB.tbl_CLIENT
                             Where c.BEZEICHNUNG.Equals(My.Computer.Name)
                             Select c
    
    
    100:        CLIENT.Single.C_VERSION = My.Application.Info.Version.ToString
    110:        myDB.SaveChanges()
    
    120:    Catch ex As Exception
    130:        AddMsg("Fehler in CheckForUpdate Zeile " & Err.Erl & ": " & ex.Message)
    140:        Application.Restart()
    150:    Finally
    160:        myDB.Dispose()
    170:        myDB = Nothing
    180:        lblLastUpdate.Text = "Udp. " & Now.ToString
    190:        If blManuell Then AddMsg("Updateprüfung beendet.")
    200:    End Try
    
        End Sub
    
        Private Sub ADLaunchAppUpdate_UpdateCompleted(sender As Object, e As AsyncCompletedEventArgs) Handles ADLaunchAppUpdate.UpdateCompleted
    10:     Try
    20:         Application.Restart()
    
    30:     Catch ex As Exception
    40:         AddMsg("Fehler in ADLaunchAppUpdate_UpdateCompleted Zeile " & Err.Erl & ": " & ex.Message)
    50:     End Try
        End Sub
    
        Private Sub ADLaunchAppUpdate_CheckForUpdateCompleted(sender As Object, e As CheckForUpdateCompletedEventArgs) Handles ADLaunchAppUpdate.CheckForUpdateCompleted
    10:     Try
    20:         If (e.UpdateAvailable) Then
    30:             BeginUpdate()
    40:         End If
    
    60:     Catch ex As Exception
    70:         AddMsg("Fehler in ADLaunchAppUpdate_CheckForUpdateCompleted Zeile " & Err.Erl & ": " & ex.Message)
    80:     End Try
        End Sub
    
        Private Sub BeginUpdate()
    10:     Try
    20:         ADLaunchAppUpdate = ApplicationDeployment.CurrentDeployment
    30:         ADLaunchAppUpdate.UpdateAsync()
    
    40:     Catch ex As Exception
    50:         AddMsg("Fehler in BeginUpdate Zeile " & Err.Erl & ": " & ex.Message)
    60:         Application.Restart()
    70:     End Try
        End Sub

    
    

    Sollte es doch zu einem Fehler kommen, so wird die Anwendung neu gestartet.
    Bis jetzt war das allerdings nicht der Fall und es funktionierte bisher tadellos.

    Vielen Dank nochmals für die Unterstützung.


    Viele Grüße, Volker





    • Als Antwort markiert Volker S Montag, 12. September 2016 08:06
    • Bearbeitet Volker S Montag, 12. September 2016 08:08
    Montag, 12. September 2016 08:02