Benutzer mit den meisten Antworten
sporadischer Fehler bei AutoUpdate-Prüfung einer ClickOnce-Anwendung

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
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
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?
-
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
-
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-2Das 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 -
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
-
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
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 22. August 2016 11:31
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 2. September 2016 07:18
- Tag als Antwort aufgehoben Volker S Montag, 12. September 2016 07:51
-
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