VB.NET: Internet Updater für die eigene Software

myselfuppdateappFür meine Software ImageRunner war ich auf der Suche nach einer Möglichkeit die Software übers Netz zu aktuallisieren. Als erstes hab ich mir ein paar Schnippsel im Internet gesucht und zu einer ganzen Klasse zusammengefügt und ausgebaut damit man damit ein Update durchführen kann. Nach einigem hin und her hab ich das ganze noch etwas verfeinert, so dass in der Anwendung möglichst wenig einzurichten ist.

[download#1#format=1]

OK, was brauchen wir alles dazu. Zuerst mal brauchen wir im Internet eine Quelle die uns die aktuell verfügbare Version liefert um diese mit der installierten zu vergleichen. Dazu reicht im Normalfall eine einfache Textdatei mit der Versionsnummer, um die URL der Setupdatei nicht im Programm festlegen zu müssen schreiben wir diese ebenfalls in die Textdatei, nennen wir sie mal current.txt:

1.0.0.1;http://demo.kaesers.net/selfupdateapp/my_setup.exe

Um diese Datei auch aus der Anwendung heraus wieder zu finden musst du den URL der current.txt in dein Programm aufnehmen.

My.Settings.UpdateURL = "http://demo.kaesers.net/selfupdateapp/current.txt"

Desweiteren solltest du festlegen wann nach dem Start der Anwendung mit der Updatesuche begonnen wird, eine kleine Verzögerung schadet mit Sicherheit nicht um das Programm während der Initialisierung nicht durcheinander zu bringen (Wert in Millisekunden):

My.Settings.UpdateDelay = 2500

Und natürlich sollten wir dem User die Möglichkeit lassen das automatische Update auszuschalten, man weiß ja nie, im Standard legen wir es aber natürlich auf true fest und ein Link zu unserer Homepage schadetebenfalls nicht:

My.Settings.AutoUpdate = true
My.Settings.Homepage = "http://www.kaesers.net/"

Die UpdaterClass kapselt fast den ganzen Updatevorgang, fügen Sie diese und den Update Dialog Ihrem Projekt hinzu. In der Klasse UpdateCaller finden Sie die Methode RunUpdate sie startet den eigentlichen Updatevorgang nachdem ein Update gefunden wurde. Hier kann es sein das Sie ein paar Anpassungen durchführen müssen:

    Public Sub RunUpdate()
 
        UpdateDialog.ProgramName = My.Application.Info.Title
        UpdateDialog.ProgramVersionText = My.Application.Info.Title & " " & _UPD.CurrentVersion.ToString
        UpdateDialog.InfoLinkURL = My.Settings.Homepage
        UpdateDialog.Updater = _UPD
        UpdateDialog.Text = My.Application.Info.Title & " Update"
        UpdateDialog.OptionDialog = OptionDialog
 
        ' change this to true the user can select the destination folder of the downloaded file
        UpdateDialog.SaveAsDialog = _SaveAsDialog
 
        Try
            If UpdateDialog.ShowDialog(_ParentForm) = Windows.Forms.DialogResult.Yes Then
                _ParentForm.Close()
            End If
        Catch ex As Exception
        End Try
 
    End Sub

In der Sub RunUpdate dürfte die Eigenschaft UpdateDialog.Optiondialog höchstwahrscheinlich immer noch ein Punkt zum Anstoß sein. Dieser müsste jetzt immer noch in der Fehlerliste von Visual Basic Express oder Visual Studio stehen. In der Zeile UpdateDialog.OptionDialog = OptionDialog können Sie Ihren Dialog festlegen in dem der Benutzer die Einstellung für das automatische Update ändern kann. Im ersten Moment können Sie diesen auch mal auskommentieren.

Fügen Sie nun Ihrer Anwendung folgenden Code hinzu um die asynchrone Updatesuche einzurichten:

    ' Updater einrichten
    Private _UPDC As New UpdateCaller(Me, My.Settings.UpdateURL)
 
    Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
 
        ' Search for updates if necessary
        If My.Settings.AutoUpdate Then
            _UPDC.Check4UpdateAsync(My.Settings.UpdateDelay)
        End If
 
    End Sub

Für die manuelle Suche:

    ' manual search
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        _UPDC.Check4UpdateManual()
    End Sub

Fertig.

weiter haben Sie die Möglichkeit die Events UpdateFound und NoUpdateFound abzufangen, achten Sie dabei darauf dass diese Events aus einem anderen Thread kommen und zum Hauptthread gemarshalled werden müssen z.B.:

    ' Hide the progressbar when background update is finished
    Private Sub NoUpdateAvailableHandler() Handles _UPDC.NoUpdateFound, _UPDC.UpdateFound
        ' this method is called from an other thread!!!
        Me.Invoke(New MethodInvoker(AddressOf ThreadsafeHideProgressbar))
    End Sub

Für diejenigen die es bevorzugen zu wissen wo das heruntergeladene Update verschwunden ist können Sie beim einrichten des Updaters einen weiteren Parameter angeben der dem User dann erlaubt den Speicherort des Downloads selber festzulegen:

    ' Updater einrichten
    Private WithEvents _UPDC As New UpdateCaller(Me, My.Settings.UpdateURL, True)

updatedialog

46 Gedanken zu „VB.NET: Internet Updater für die eigene Software“

  1. Hallo Alex, vorab: RECHT HERZLICHEN DANK FÜR DIESE UPDATEROUTINE!!!!!

    Ich bekomme aber immer wieder diesen Fehler:
    „Die DownloadBuildAsync-Funktion gibt nicht für alle Codepfade einen Wert zurück. Fehlt eine Return-Anweisung?“
    Woran kann das liegen? Was mache ich falsch?

  2. hi @ all, ich werde mich nun der Lecherlichkeit preis geben 😉 aber…
    ich bin wohl zu dusselig dazu… mal erlich bin nur ein kleiner AHK nutzer^^ und ich finde nichts um mein auto update zum laufen zu bringen und dies hier ist ja recht klasse aber ich komm damit grade mal überhaubt nicht klar^^
    wenn ich das in mein AHK einbinde bekomme ich schon beim ersten teil
    ( ob mit …http://demo… oder mit meiner URL)
    „My.Settings.UpdateURL = „http://demo.kaesers.net/selfupdateapp/current.txt“ ==> The following variable name contains an illegal character:

    ich muss gestehen ich hatte es dann sogar unter …\MySelfUpdateApp\bin\Debug
    ich habe dann einfach die URL geändert 21.0.0.1;http://demo.kaesers.net/selfupdateapp/my_setup.exe
    aber nun habe ich das weitere problem das bei diesem fenster

    http://www.kaesers.net/wp-content/uploads/2009/01/updatedialog.png

    der Text fest sitzt und mir würde im grunde ja reichen das ich den TXT ändern könnte das es eben zu meinem projekt past^^

    vl hat jemand ein fertiges skript welches ich nur noch auf meine texte und URLs abändern müsste… das währe echt klasse

    ich bitte um hilfe

  3. Hallo Alex,
    auch von mir ein herzlichen Dank für den Source und die Arbeit die du dir gemacht hast
    um Dummis wie mir zu helfen 🙂

    Allerdings habe auch ich ein kleines Problem und komme derzeit nicht mehr weiter,
    vielleicht kannst du mir einen Tipp geben:

    Ich hab den Source Schrittweise in ein „Hello Welt“-Projekt eingebunden und soweit
    wie beschrieben konfíguriert. Das Update wird erkannt und auch herunter geladen.
    Aber beim Versuch die EXE auszutauschen bekomme ich in der SUB „DownloadComplete“ einen Fehler, wenn das Prog versucht die vorhandene EXE zu löschen.
    Ist doch eigentlich auch klar, weil exe läuft ja noch… oder…

    Wo ist der Fehler, kannst du mir einen Tipp geben?

Kommentar verfassen