[VB.NET]Simplen Updater erstellen ( PRINZIP )

  • Hallo Liebe Deutsche Sa-mp Community ,


    in diesem Tutorial möchte ich einfach mal erklären wie man mit ein paar Handgriffen ein simples Update Programm erstellt und damit seine eigenen Programme
    einfach mal auf dem neusten Stand hält.
    Wie gesagt dieses Tutorial bezieht sich voll und ganz auf die Sprache Visual Basic.NET und ja legen wir mal los ;)


    Als erstes startet ihr Visual Basic , sollte soweit sowieso klar sein dann führt ihr folgende Schritte aus...


    • Geht ins Menü auf Datei dort auf Neues Projekt
    • Startet eine Windows Forms Anwendung auf Visual Basic.NET Ebene ( Für die , die Visual Studio nutzen Visual Basic.NET auswählen als Sprache wie gesagt )


    So nun habt ihr ein leeres Formular vor euch sprich ein leeres Standardfenster, so als erstes solltet ihr wissen das es in Visual Basic.NET einfach ist Kontrollelemente zu erstellen,
    Buttons, List Boxen und so weiter , diese lassen sich mit ein paar Klicks einfach in dieses Leere Fenster hineinziehen sag ich mal,
    finden könnt ihr sie in der "Toolbox" sprich Werkzeugbox zu Deutsch.
    Nun solltet ihr auch wissen das Subfunktionen sprich Rückruffunktionen für diese Elemente ebenso einfach erstellt werden können um dies genauer zu erklären macht ihr folgendes...


    • zieht einen Button ins Formular ( Später unser Update Check Button ;) )
    • klickt doppelt drauf


    So nun solltet ihr sehen das das eine Rückruffunktion erstellt wurde die dann aufgerufen wird wenn der Button geklickt wird wie man ganz gut erkennen sollte,
    entweder an den Handle Eigenschaften die sich ziemlich genau hinten an der Subfunktion befinden oder auch an dem Namen und dahinter den Namen der gewünschten Aktion
    sprich "elementname_click" als Beispiel jetzt mal ;)
    Die Aktion "Click" brauchen wir später auch aber nun nochmal zur Informationen es lassen sich in Elementen auch ganz leicht andere Aktionen generieren,
    entweder man ändert die Eigenschaften der Handle Einstellung oder man klick sich in die Subfunktion rein sprich auf den Kopf drauf klicken und nun oben Rechts
    sollte man eine ausklappbare Liste haben diese klickt ihr an und wählt halt die jeweilige Rückruffunktion die euch der Code generieren soll sprich ihr müsste
    diese Rückrufe nicht selber extra eintippen, das zeichnet die IDE aus sprich der Editor vereinfacht euch halt einiges.


    So kommen wir endlich zum Hauptthema dem Updater , das waren jetzt nur nochmal schnelle Einstiegsinformationen ;)
    als geht ihr zur Click Aktion des Buttons und macht folgendes ...


    • Erstellt den Verweis auf den Web Client sprich der später die Dateien herunterlädt
    PHP
    Dim client As New Net.WebClient


    die Variable "client" enthält nun Subelemente für die Aktionen/Funktionen des Web Client, sprich sie speichert Informationen zum Download
    und weiteres.
    Kleine Erklärung nebenbei + Frage : "Warum eine neue Variable für einen Download ?"


    Ganz Einfach : Das hat damit zu tun das diese Funktion nur einen Download behalten kann bzw. ausführen sprich ihr könntet so keine Multifunktionalen Downloads ausführen dazu werden dann meist Klassen verwendet , so lassen sich neue Informationen / Funktionen aus solchen Klassen mit deren Funktionen ganz einfach in Variablen portieren und von da ausführen so kann man die Klasse mehrmals verwenden ohne jedes mal , sag ich mal einen neuen extra Code dafür zu schreiben bzw. ihn neu zu kopieren mit anderen Informationsspeichern sondern kann sie bequem der Befehl in eine Variable portieren
    und halt so neue Zugriffe verwalten mit neuen Informationsspeichern das spart nicht nur Zeit sondern auch Ressourcen.


    So wieder zurück zum Web Client ;)
    das erste was wir nun machen ist eine Textdatei erstellen und dort unsere Programmversion hinein zuschreiben wie z.b. 1.0 oder 0.2 oder was weiß ich,
    halt die Version eures Programms , diese nehmt ihr nun und ladet sie auf euren FTP hoch in einen Ordner wo ihr sie später downloaden werdet.
    Kleines FAQ nebenbei ;)


    Q : Wozu dient diese Datei ?
    A : Ganz einfach, sie wird später von eurem Programm Temporär heruntergeladen und dann ausgelesen und verglichen mit der Aktuellen Version ( dazu später mehr )



    So kommen wir zum Download dieser Datei bezüglich eures Codes, da ihr den Verweis auf den Web Client schon erstellt habt verwenden wir ihn nun auch,
    folgendermaßen.


    SQL
    client.DownloadFile("eureUrl/temptext.txt", My.Computer.FileSystem.SpecialDirectories.Temp & "\temptext.txt")


    so wie ihr seht nehme ich die variable und greife auf das Subelement "DownloadFile" zu , Format :


    Code
    .DownloadFile("Adresse","Zielordner")


    So wie ihr seht kommt erst unsere Adresse zur Textdatei auf eurer Seite und dann der Zielpfad wo die Datei gespeichert werden soll,
    hier im Code speichere ich sie in den Temp. Daten , halt als Trashdatei sprich Müll ;)
    Wir werden diese Datei dort auch wieder auslesen , kommen wir am besten auch gleich mal dazu...


    Also bevor ich hier mehr dazu von mir gebe sage ich erst einmal eines dazu, jeder hat seine Methode Dateien auszulesen,
    ich verwende hier meine die ich am besten finde und auch am sichersten sag ich mal also bitte keine Verbesserungen,
    sprich keine Kommentare diesbezüglich, danke ;)


    Nun erstellen wir eine Variable die sich hier iox nennt , ihr könnt sie natürlich so benennen wie es euch beliebt ;)
    damit greifen wir auf das Dateisystem zu und erstellen einen neuen StreamReader sprich damit lesen wir den Daten Stream aus die
    Daten Ströme zu Deutsch , wir können auch gleich angeben was ausgelesen werden soll wie ihr seht , nun lesen wir folgendes aus :


    Code
    My.Computer.FileSystem.SpecialDirectories.Temp & "\temptext.txt"


    dies ist aber nur ein Beispiel, dort kommt natürlich der Pfad hin wo die Textdatei gespeichert wurde.


    so als nächstes kommt das Format zum encodieren der Datei ist jedoch nicht wirklich wichtig
    aber ich stelle es zur Sicherheit auf "Default" sprich auf den Standardformat,
    so wird der Format genommen in dem die Datei halt besteht ;)


    SQL
    Dim iox As New IO.StreamReader(My.Computer.FileSystem.SpecialDirectories.Temp & "\temptext.txt", System.Text.Encoding.Default)



    So nächster Punkt, den Zugriff auf den Stream.
    wir erstellen hier eine Variable die ich mal "ot" genannt hab und verweise sie direkt auf den Inhalt vom Stream sprich lese die Datei aus
    der Inhalt landet als Stringformat in "ot", diese Variable enthält nun die Information bezüglich der Version.

    SQL
    Dim ot As String = iox.ReadToEnd

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


    Einmal editiert, zuletzt von BlackFoX ()

  • Letzter Schritt, wir verwerfen die Ressourcen in "iox" sprich schließen den Stream und geben die Datei wieder frei.

    PHP
    iox.Close()



    Kommen wir zur Abfrage sprich dem Vergleich der Versionen,
    hier gilt vorerst eines zu sagen, wir speichern die neuen Informationen der Version in der Registrierung und werden sie von da auch immer abrufen
    weil es so keinen Dateisalat gibt und das ganze zudem dann auch sicher untergebracht ist.


    Wie man sieht wird die Version aus der Variable "ot" da wo wohin die Daten der Textdatei ausgelesen wurden überprüft und
    abgefragt "falls nicht" , wir überprüfen hier mit dem Schlüssel aus der Registrierung :

    Code
    HKEY_CURRENT_USER > Software > deinprodukt > version


    darin werden später auch die neuen Informationsdaten gespeichert ( dazu später mehr )


    sollte der Schlüssel nicht gefunden werden oder nicht ausgelesen werden können so wird als Standardwert "0.0" wiedergegeben
    also Version 0.0 halt

    SQL
    If Not ot = My.Computer.Registry.GetValue("HKEY_CURRENT_USER\Software\deinprodukt", "version", "0.0") Then



    So nun zudem was passieren soll wenn die Version ein Update erhalten >sollte<...


    Ich habe das ganze nochmal etwas auf gestaltet und bin so freundlich sag ich mal und frage den Benutzer nochmal ob er auch ein Update durchführen möchte.


    Ich frage hier ab ob der Benutzer Updaten möchte, sprich ich frage ab ob das Ergebnis der Nachrichtenbox "MsgBoxResult.Yes" ist sprich
    ob "ja" angeklickt wurde , sprich die Resultate der Aktion die in der Nachrichtenbox ausgeführt wurden, sollte eigentlich einfach zu verstehen sein ;)

    PHP
    If MsgBox("Eine Neue Version von 'deinprodukt' verfügbar , Version '" & ot & "'" & _
                  vbNewLine & "Möchten sie ein Update durchführen ?", MsgBoxStyle.Question + MsgBoxStyle.YesNo, "Update") = MsgBoxResult.Yes Then



    So fahren wir fort, hat der Benutzer nun "ja" angeklickt so soll folgendes passieren , genau ein Update...


    dazu starten wir vom gleichen Verweis auf den Web Client einen Synchronisierten Download, dazu tun wir folgendes...
    wir nehmen die Variable Client noch einmal her und wählen die Option des Synchronisierten Downloads,
    als erstes übergeben wir wieder unsere Download Adresse um "Uri" Format dazu erstellen wir eine neue Uri
    wie man sehen kann und übergeben die Adresse darin , danach kommt wieder unser Zielpfad , den ihr genauso selber bestimmen könnt.

    PHP
    client.DownloadFileAsync(New System.Uri("deineurl/produkt.zip"), My.Application.Info.DirectoryPath & "\produkt.zip")



    So hier kommen wir nochmal zu den Extra wie den Fortschrittsbalken..
    dazu tut ihr folgendes , ihr geht wieder in den Designer eures Editors und dort wählt ihr in der Toolbox
    die "Progressbar" aus , diese zieht ihr nun so ins Fenster wie ihr sie haben wollt,
    nun geht zurück in den Code und es geht folgendermaßen weiter...



    So nun übergebt ihr die Rückrufe damit ihr den Fortschritt später sehen könnt bzw. ihn abfragen
    und schauen könnt wann euer Download Fertig ist.
    Die jeweiligen Rückrufe holt ihr aus der Web Client Variable denn daraus resultieren später auch die Fortschritte,
    wie ihr seht verweise ich "DownloadProgressChanged" auf "DownloadProgress"
    beim anderen genauso nur mit anderen Funktionen und einer anderen Subfunktion.


    PHP
    AddHandler client.DownloadProgressChanged, AddressOf DownloadProgress
    AddHandler client.DownloadFileCompleted, AddressOf DownloadFertig


    Hier mal die Subfunktionen dazu


    Wie ihr seht haben ihre Köpfe deren Parameter man so nicht herausfindet, diese findet man aber heraus indem man in "client" nochmal
    die Subelemente auswählt die benötigt werden und nachschaut, dort sollten sie dann in Klammern hinter den jeweiligen Aktionsnamen stehen ;)


    So kommen wir zu diesen Rückruffunktionen , ich hab bereits erwähnt wozu sie diesen und ihre Namen sagen bestimmt auch einiges aus...
    wie ihr seht lasse ich den Status des Fortschritts hier in den Fortschrittsbalken wandern der "Progressbar"
    die Fortschrittsinformationen holt ihr euch aus der Variable "e" die ihr dann direkt an den Fortschrittsbalken übergeben könnt.


    PHP
    Private Sub DownloadProgress(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs)
    Me.ProgressBar1.Value = e.ProgressPercentage
    End Sub


    So hier wird nun das getan was danach notwendig wäre, die neue Version einzutragen in den Pfad der Registrierung wo ihr auch
    die Aktuellen Informationen bezüglich eures Programms abruft.
    Das ganze wird dann extra beim beenden des Downloads erledigt, muss es aber nicht , eine andere Variante wäre das euer Programm diese
    beim Start eintragen lässt sprich diese überträgt so muss der Update Manager dies nicht tun, wäre aber auch nur eine Idee ;)


    PHP
    Private Sub DownloadFertig(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
    My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\deinprodukt", "version", ot)
    End Sub



    So zum Schluss gilt nur noch eines zu sagen , vergesst eure Abfragen nicht mit End if abzuschließen ;)
    so wäre der Code dann auch komplett und das wichtigste ergänzt eure Daten, Pfade und Zieladressen.


    So das war es soweit zu diesem Tutorial was eigentlich ganz simpel zu verstehen sein sollte, ich hoffe ihr kommt damit klar und kopiert nicht nur sondern lest
    auch wirklich und versucht es wirklich nachzuvollziehen denn wer auch mit eigenen Köpfchen arbeitet kapiert schneller.
    Das wichtigste ist das ihr schon Erfahrungen mit Visual Basic haben solltet sprich es wäre definitiv nichts für Anfänger denn diese
    würden sowieso nur kopieren sobald es nicht klappt , was sehr schade wäre.


    //EDIT: vollen Code nochmal als Anhängsel ;)


    http://pastebin.com/nE2cKNCG

    • Gebraucht : 1x Button , 1x ProgressBar , beide ohne bestimmten Namen und natürlich ein Formular

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


    Einmal editiert, zuletzt von BlackFoX ()

  • Endlich mal etwas, was keine C&P´ler einfach übernehmen können. Hier wird gelernt ;)


    Noch einen Tipp für dich: Nimm die .DownloadString() Funktion. So sparst du dir auch das auslesn und wieder löschen der Datei :thumbup:


    MFG


    DarkShot


    PS: Ich persöhnlich würde sogar einfach die System.IO & System.NET einfach importieren. :thumbup:

  • - Danke für die netten Kommentare -


    Ich wäre dankbar wenn ein Administrator/Moderator dieses Thema Kurz in die Subsektion "Tutorial" verschieben könnte,
    habe beim absenden dieses Beitrags leider nicht darauf geachtet.
    Danke im voraus :)

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • Wobei ich sagen muss:


    So ein Updater sollte nicht gemacht werden, wenn man erst vor kurzer Zeit mit VB angefangen hat.
    Er ist schon ein wenig komplexer. Die Grundlagen müssen dazu sitzen...


    MFG

  • Thema wiederauferweckung :D


    Ich habe eine Frage hierzu, ist es möglich, das so umzubauen, das man mehrere Sachen runterladen kann.
    Also das man zum Beispiel 500 Files hat, die alle runtergeladen werden. Und das dann bei der nächsten änderung 520 Files oder so geladen werden, also immer nur Aktuelles.
    Ist es möglich das zu machen? Ich selber wüsste nicht wie, aber ich suche momentan was als Launcher für unseren ArmA3 Modserver, da kämme das Perfect!
    Wäre supi, wenn mir da jemand weiterhelfen könnte!

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Ist es möglich das zu machen? Ich selber wüsste nicht wie, aber ich suche momentan was als Launcher für unseren ArmA3 Modserver, da kämme das Perfect!

    Am sinnvollsten ist da eine Datei, die auf dem Server liegt in dem sämtliche Dateien mit MD5-Checksum o.ä. eingetragen sind. Diese lädst du mit dem Launcher herunter und überprüfst alle Dateien.
    Sollten da Unterschiede auftreten, sind sie herunterzuladen.


    Mein CS:GO Server: 62.75.168.39:27016


    Ich bin so hungrig, dass ich vor lauter Durst nicht weiß, was ich rauchen soll - so müde bin ich!
    Freedom is just another word for 'Nothing left to lose'

  • Naja, prinzipiell eine Reihe von Buchstaben und Zahlen, die die "Einzigartigkeit" einer Datei bestätigt.


    Mein CS:GO Server: 62.75.168.39:27016


    Ich bin so hungrig, dass ich vor lauter Durst nicht weiß, was ich rauchen soll - so müde bin ich!
    Freedom is just another word for 'Nothing left to lose'

  • https://support.microsoft.com/en-us/kb/301053


    Alternativ nimmst du halt nicht die MD5-Checksum sondern Dateigröße + Bearbeitungsdatum o.Ä.
    Andere arbeiten auch gerne ganz simpel mit Versionsverzeichnissen, in denen alle herunterzuladenen Dateien der nächsten Version liegen.


    Mein CS:GO Server: 62.75.168.39:27016


    Ich bin so hungrig, dass ich vor lauter Durst nicht weiß, was ich rauchen soll - so müde bin ich!
    Freedom is just another word for 'Nothing left to lose'