Updater aus Ressourcen entpacken

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von mrwebber.

    Updater aus Ressourcen entpacken

    Hi,

    ich packe einen Updater aus den Ressourcen. Dieser soll die eigentliche Applikation löschen, die neue laden und wieder starten.
    Das Problem ist jetzt allerdings, dass ich keinen Zugriff zum Löschen der alten Applikation bekomme ...
    Starte ich den entpackten Updater dann von Hand, klappt alles problemlos ...

    Kann es sein, dass es daran liegt, dass der Updater ein Kindprozess der Applikation ist? Kann er dann die Applikation nicht löschen, obwohl diese beendet wurde?
    Ich habe das Starten des Updaters mit Process.Start() sowie Shell() versucht. Beides mal das gleiche Phänomen ...

    Bitte helft mir ... sowas ist echt hart für die Nerven ?(

    Edit by der_Kurt:
    Gehört nicht zu den VB-Grundlagen
    * Topic verschoben *

    Variablen über das Internet senden? [VB.NET] Universal Ticket.dll :thumbup:
    Lasse deine Programme selbstständig lernen! [VB.NET] Brain.dll
    :thumbsup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „der_Kurt“ ()

    Hab ich auch, selber Mist ...
    Ich möchte nochmal betonen, dass es von Hand problemlos klappt, auch ohne Adminrechte oder sonstiges ... soll heißen ich starte einfach den entpackten Updater von Hand und alles funzt wie es soll ...

    Variablen über das Internet senden? [VB.NET] Universal Ticket.dll :thumbup:
    Lasse deine Programme selbstständig lernen! [VB.NET] Brain.dll
    :thumbsup:
    Ich zeige euch mal beide Codes:

    Applikation: (diese lädt ehrlich gesagt die neue Applikation runter, damit die Wartezeit verkleinert wird)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Diagnostics 'Für Process
    2. Public Class UpdateManager
    3. Public Structure Referenzen 'Hier werden die Referenzen der Ordnung halber gespeichert
    4. Dim refController As Controller
    5. Dim refEncoder As Encoder
    6. Dim refGUIMaster As GUIMaster
    7. End Structure
    8. Public refReferenzen As Referenzen 'In diesem Referenzen-Objekt werden die Referenzen vom Controller eingespeichert
    9. Private sUpdaterDateiName As String = "Updater.exe"
    10. Private sDateiNameUpdate As String = "Aktuell" 'Name der Datei, die als Update heruntergeladen wird. Sie wird vor der Nutzung wieder in "Runtime 2 Panamon.exe" umbenannt
    11. Public Sub updateAngekommen(ByVal sVersion As String, ByVal sLink As String)
    12. If sVersion <> Tools.sVersion Then 'Versionen sind ungleich, dh. neuere Version gibt es zum Download.
    13. If ladeUpdateRunter(sLink) Then
    14. entpackeUpdater()
    15. starteUpdaterUndBeendeClient()
    16. Else
    17. 'Das Update ist gescheitert, da der Download nicht funktioniert hat ...
    18. End If
    19. End If
    20. End Sub
    21. Public Sub checkObGeupdated()
    22. If DateiZugriff.pruefeVorhanden(sUpdaterDateiName, False) Then 'Es wurde ein Update gemacht, da der Updater noch da ist
    23. beendeUpdater()
    24. loescheUpdater()
    25. macheMeldungUpdateErfolgreichInstalliert()
    26. End If
    27. End Sub
    28. Private Function ladeUpdateRunter(ByVal sLink As String) As Boolean
    29. DateiZugriff.loescheDatei(sDateiNameUpdate, False)
    30. Return DateiZugriff.ladeHerunter(sLink, sDateiNameUpdate, False)
    31. End Function
    32. Private Sub entpackeUpdater()
    33. System.IO.File.WriteAllBytes(sUpdaterDateiName, My.Resources.runtime2panamonUpdater)
    34. End Sub
    35. Private Sub starteUpdaterUndBeendeClient()
    36. Shell(My.Application.Info.DirectoryPath & "\" & sUpdaterDateiName)
    37. refReferenzen.refController.runtimeBeenden()
    38. End Sub
    39. Private Sub beendeUpdater()
    40. For Each p In Process.GetProcesses
    41. If p.ProcessName = "Updater" Then
    42. p.Kill()
    43. End If
    44. Next
    45. End Sub
    46. Private Sub loescheUpdater()
    47. DateiZugriff.loescheDatei(sUpdaterDateiName, False)
    48. End Sub
    49. Private Sub macheMeldungUpdateErfolgreichInstalliert()
    50. refReferenzen.refGUIMaster.zeigeTooltip(Tools.strSprachTexte.sUpdateInstalliertTitel, Tools.strSprachTexte.sUpdateInstalliertText)
    51. End Sub
    52. End Class



    Updater: (Zeile 6 bzw 15 beendet den Client)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private sProgrammname As String = "Applikation"
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Me.Visible = False
    5. Try
    6. beendeClient()
    7. loescheClient()
    8. benenneDownloadUm()
    9. starteNeuenClient()
    10. Catch ex As Exception
    11. MsgBox("UPDATE FEHLER:" & vbNewLine & vbNewLine & ex.Message & vbNewLine & vbNewLine & "Bitte teile diesen Fehler dem Entwickler-Team mit!", MsgBoxStyle.Critical)
    12. End Try
    13. Me.Close()
    14. End Sub
    15. Private Sub beendeClient()
    16. System.Threading.Thread.Sleep(3000) '3 Sekunden warten, damit auf jeden Fall die Applikation normal beendet werden konnte
    17. For Each p In Process.GetProcesses
    18. If p.ProcessName = sProgrammname Then
    19. p.Kill()
    20. End If
    21. Next
    22. End Sub
    23. Private Sub loescheClient()
    24. My.Computer.FileSystem.DeleteFile(sProgrammname & ".exe")
    25. End Sub
    26. Private Sub benenneDownloadUm()
    27. My.Computer.FileSystem.RenameFile("Aktuell", sProgrammname & ".exe")
    28. End Sub
    29. Private Sub starteNeuenClient()
    30. Process.Start(sProgrammname & ".exe")
    31. End Sub
    32. End Class



    EDIT: Vielleicht kommt der Fehler ja gar nicht beim Löschen, sondern beim Versuch, die Applikation zu killen? :S Das klingt doch logsich, oder? Es ist ein Kindprozess und darf das deshalb nicht?
    Wie könnte ich vorgehen, damit der Updater nicht von der Applikation aus gestart wird, sondern von Windows oder so was? Updater immer laufen lassen ist keine Option da das Programm z.B. auch von USB-Sticks aus laufen wird.

    Variablen über das Internet senden? [VB.NET] Universal Ticket.dll :thumbup:
    Lasse deine Programme selbstständig lernen! [VB.NET] Brain.dll
    :thumbsup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mrwebber“ ()

    Es wird immer seltsamer. Jetzt habe vor und nach dem .kill() eine MsgBox gemacht und ... es ging einfach. Kann es sein dass das Kill() im Hintergrund noch Zeit braucht, bis die .exe wirklich gekillt ist, aber mein Programm (Updater) gleich weiter läuft. Durch die MsgBox vergeht die notwendige Zeit und alles funktioniert? Dann werde ich jetzt mal prüfen, ob die .exe weg ist bevor ich mit löschen und co. starte. Melde mich wieder.

    Variablen über das Internet senden? [VB.NET] Universal Ticket.dll :thumbup:
    Lasse deine Programme selbstständig lernen! [VB.NET] Brain.dll
    :thumbsup:
    Hm. Also jetzt hat es so funktioniert. Ob meine Erklärung jetzt zu 100% stimmt kann natürlich nicht sagen, aber kann ja sein dass kill() einfach Windows mitteilt, das Ding zu killen und mein Updater munter weiter läuft ...

    Codeänderung im Updater:

    VB.NET-Quellcode

    1. Private Sub beendeClient()
    2. System.Threading.Thread.Sleep(3000)
    3. For Each p In Process.GetProcesses
    4. If p.ProcessName = sProgrammname Then
    5. p.Kill()
    6. End If
    7. Next
    8. Dim bNochDa As Boolean = True
    9. Do
    10. bNochDa = False
    11. For Each p In Process.GetProcesses
    12. If p.ProcessName = sProgrammname Then
    13. bNochDa = True
    14. Exit For
    15. End If
    16. Next
    17. System.Threading.Thread.Sleep(1000)
    18. Loop Until bNochDa = False
    19. End Sub

    Variablen über das Internet senden? [VB.NET] Universal Ticket.dll :thumbup:
    Lasse deine Programme selbstständig lernen! [VB.NET] Brain.dll
    :thumbsup:
    Zur Info: Du solltest nicht die Kill() Methode verwenden, da dies das Selbe wie "Prozess beenden" ist und somit zu Datenverlust etc. führen kann. Beende den Prozess normal und warte mit process.WaitForExit() darauf, dass der Prozess beendet wird.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Ich beende das Programm ja schon von der Applikation selbst aus normal. Dann lasse ich den Updater 3 s warten. So lange sollte die Applikation niemals zum Beenden brauchen. Danach lasse ich sie killen falls noch da.

    Variablen über das Internet senden? [VB.NET] Universal Ticket.dll :thumbup:
    Lasse deine Programme selbstständig lernen! [VB.NET] Brain.dll
    :thumbsup: