Automatischer Updater

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von Castiel.

    Automatischer Updater

    Hey ho,

    Sry wenn ich im falschem Bereich poste, aber ich weiss nicht genau wo ich diesen Post sonst schreiben soll :>

    Folgendes:

    Ich möchte gerne einen Launcher schreiben, mit dem mein Programm geuppdatet bzw die neue Version heruntergeladen und installiert wird. So umfangreich wie möglich währe mir am liebsten ;D

    Ich bin im bereich vb noch ein Anfänger und kann bislang nur Grundlagen. Ich habe bis jetzt zwar einen automatischen Download & (halbwegs) meiner vorstellung entsprechenden Installation geschrieben, das Problem dabei ist, dass ich gerne ein automatisches Update durchführen lassen möchte WENN die version Datei auf meinem ftp höher ist als die, die ich dem Setup meines programmes hinzugefügt habe. Jedoch funktioniert das merkwürdiger weise nicht ?( hier einmal mein Versuch:

    VB.NET-Quellcode

    1. Private Sub httpclient_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles httpclient.DownloadFileCompleted
    2. MsgBox("Download Completed!", MsgBoxStyle.Information, "Succes!")
    3. Shell(Pfad)
    4. End Sub
    5. Private Sub httpclient_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles httpclient.DownloadProgressChanged
    6. Me.ProgressBar1.Value = e.ProgressPercentage
    7. Dim totalbytes As Double = e.TotalBytesToReceive / 1048576
    8. Dim bytes As Double = e.BytesReceived / 1048576
    9. Me.Label1.Text = bytes & " MB von " & totalbytes & " MB"
    10. End Sub
    11. Private Sub WebBrowser3_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser3.DocumentCompleted
    12. End Sub
    13. Private Sub OpenFileDialog1_FileOk(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk
    14. End Sub
    15. Private Sub SaveFileDialog1_FileOk(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles SaveFileDialog1.FileOk
    16. End Sub
    17. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    18. If WebBrowser3.DocumentText > "1.1" Then
    19. MsgBox("Download started", MsgBoxStyle.Information)
    20. httpclient = New WebClient
    21. Dim URL As String = "Hier könnte ein Link stehen :P"
    22. Application.DoEvents()
    23. httpclient.DownloadFileAsync(New Uri(URL), Pfad)
    24. Application.DoEvents()
    25. Button1.Enabled = False
    26. End If
    27. End Sub
    28. End Class


    Die leeren Zeilen einfach mal bitte ignorieren. Um Missverständnissen vorzubeugen, natürlich habe ich das Label "VersionS" mit der version Datei des PC's verknüpft:

    VB.NET-Quellcode

    1. VersionS.Text = My.Computer.FileSystem.ReadAllText("Hier könnte ein Link stehen :P")


    Dann würde ich die MB Zahl der heruntergeladenen Datei gerne 2 stellig anzeigen lassen, sind momentan 7 oder mehr hinterm Komma.

    Bitte faucht mich nicht gleich doof an, ich bin wie gesagt noch lange nicht so gut wie ihr mit vb^^

    ich würde mich über schnelle Antworten freuen :)

    Lg Cass

    Edit by nikeee13:
    Es handelt hier sich sicherlich nicht um VBS. Thread verschoben.

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

    Hey,

    Für den Versionsabgleich:

    VB.NET-Quellcode

    1. Dim serverversion As Integer = httpclient.DownloadFile("PFAD")
    2. If serverversion > My.Application.Info.version Then
    3. 'Update starten
    4. End If



    So und nun zum MB umrechnen

    VB.NET-Quellcode

    1. Dim MB as Interger = 0
    2. 'MB vom httpcient auslesen, aber das kannst du ja
    3. MB=MB /1024 / 1024
    4. MB= Math.Round(0,2)


    Bei dem Runden bin ich mir jetzt nmicht 100%ig sicher, schau einfachmal was dir VB anzeigt beim schreiben ;)
    Danke erstmal für die Antwort :)

    Jetzt gibt es folgendes Problem:

    "Fehler bei der Überladungsauflösung, da keine zugreifbare 'DownloadFile' die Anzahl von Argumenten akzeptiert."

    Muss ich noch irgendwas zu den Imports hinzufügen? Habe nur System.net.
    Ansonsten echt super Lösung! Das leuchtet mir sogar ein :D

    Lg
    Du könntest die neue Version mit My.Computer.DownloadFile() downloaden.

    Lege doch eine version.txt auf deinem Server an, in der die neueste Versionsnummer steht.
    Ob deine Version aktuell ist, kannst du prüfen, indem du deine Version mit der version.txt vergleichst.
    Jo so hab ich mir das ja auch gedacht, ich habe auf meinem ftp schon eine version Datei. Ich wollte aber die version des Servers ursprünglich mit einer lokalen version Datei vergleichen lassen, das hat aber halt nicht funktioniert. Nun gut, ich werde deinen Vorschlag mal versuchen.

    //Edit

    "DownloadFile ist kein Member von My.Computer"

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Castiel“ () aus folgendem Grund: Edit

    Ich wollte eigentlich auch ein Eigenes :D deswegen :D
    Währt ihr so nett mir fix bei meinem problem zu helfen? Ich währe euch echt suuuper dankbar.
    Also, wir waren soweit das die Lokalen Assembly informationen mit einer version Datei auf dem ftp Server zu vergleichen sind.
    Bei euren Vorschlägen bekomme ich aber Fehlermeldungen. Irgendwelche Ideen dem bezüglich?
    Ich will die Version aber nicht mit einem Label vergleichen, weil der Updater ein eigenständiges Programm ist, das nicht geupdatet wird.
    Es wird lediglich ein 2tes programm geupdatet und dafür brauche ich die version Informationen von woanders. Vielleicht habe ich das am anfang nicht gut genug formuliert.
    Leg doch im Projektordner ne version.txt an, in die du beim Start deines Programms immer die aktuelle Version reinschreibst.
    Der Updater muss dann nurnoch checken, ob die version.txt auf dem Server ne höhere Version hat als die version.txt auf deinem PC
    Einmal lese ich das Label "VersionS" aus einer lokalen Textdatei des Hauptprogrammes aus:

    VB.NET-Quellcode

    1. VersionS.Text = My.Computer.FileSystem.ReadAllText("C:\Link&so")


    Hier werden die Versionen verglichen :

    VB.NET-Quellcode

    1. If WebBrowser3.DocumentText > VersionS.Text Then
    2. MsgBox("Download started", MsgBoxStyle.Information)
    3. httpclient = New WebClient
    4. Dim URL As String = "http://Wieder ein link :=)"
    5. Application.DoEvents()
    6. httpclient.DownloadFileAsync(New Uri(URL), Pfad)
    7. Application.DoEvents()
    8. Button1.Enabled = False
    9. Else : Label2.Visible = True
    10. End If


    Dann habe ich noch versucht die Serverversion als Integer zu deklarieren:

    VB.NET-Quellcode

    1. Dim serverversion As Integer = ("http//Link nummer 3 :P")


    Das ist alles aus Tutorials zusammengeschnibbselt, konnte nix mehr ändern da ich jetzt gleich mein VB neu installieren muss oO^^ da hat sich schon wieder ein Fehler eingeschlichen. Meine ursprüngliche Version (War so ähnlich, hat aber auch nicht funktioniert) habe ich leider nicht gespeichert.

    Lg
    Ich würde erstmal Option Strict On machen :)

    Dann test es mal hiermit:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Imports System.Net
    4. Public Class Form1
    5. Dim WithEvents wc As New WebClient
    6. Private Sub Vergleichen()
    7. Dim offline_version As String = IO.File.ReadAllText("Pfad der TXT")
    8. Dim online_version As String = wc.DownloadString("URL der TXT")
    9. If online_version > offline_version Then
    10. wc.DownloadFileAsync(New Uri("URL zur EXE"), "PFAD des Updates")
    11. MessageBox.Show("Update wird heruntergeladen")
    12. End If
    13. End Sub
    14. Private Sub wc_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles wc.DownloadFileCompleted
    15. MessageBox.Show("Update wurde heruntergeladen")
    16. End Sub
    17. End Class


    Müsste funktionieren, habs nicht getestet...
    by the way: Version-Klasse
    Da muss man nicht mit Strings rumhantieren ;)

    Und um die Version deines Programms im Updater festzustellen, brauchst du auch keine Textdatei: FileVersionInfo-Klasse (Da ist unten sogar ein Code-Beispiel)

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !