[How To] Autoupdater mit Dateidownload

    • VB.NET

    Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von Kulki-See.

      [How To] Autoupdater mit Dateidownload



      Edit: Überprüfung auf Internet nun mit Ping
      Edit: FTP-Server zu finden über Google. Beispiel ist funpic.de.



      Huhu ihr :)

      Dies ist nun mein erstes Tutorial und ich hoffe mal ich kann euch da zumindest ein bisschen helfen.
      Ich möchte euch hier erklären wie ihr einen Autoupdater in euer Programm einbaut:

      [b]IZP
      = Internetadresse zum Programm (FTP-Server)
      IZV = Internetadresse zur Version.txt
      PZP = Pfad zum Programmspeicherort (lokal, eigene Dokumente)
      FTP = Internetadresse des Servers
      PN = Projektname

      So, fangen wir also an zu Programmieren.

      Als erstes geht ihr auf den Desktop und erstellt dort eine *.txt-Datei.
      Nennt die Datei 'Version' und schreibt '1.0.0.0' hinein.
      Dann speichert die Datei.

      Ladet nun die Datei auf euren Server hoch.
      Die Internetadresse sollte nun 'FTP/Version.txt' lauten.

      Nun nehmt ihr die *.exe-Datei, die euer Programm bildet, bzw. euer Programm später installiert.
      Diese ladet ihr unter dem namen 'Setup' auf euren Server.

      Nun geht ihr in euer Projekt und dann auf

      Projekt -> PN-Eigenschaften...

      Nun klickt ihr auf Assemblyinformationen und tragt bei Assemblyversion und Dateiversion
      jeweils '1.0.0.0' ein.

      Nun zum Code:

      Geht auf den Button oder ähnliches und klickt zweimal darauf.
      In der *.vb tragt ihr nun ein:

      VB.NET-Quellcode

      1. Try
      2. If My.Computer.Network.Ping("www.google.com") = True Then
      3. Else
      4. End if
      5. Catch
      6. MsgBox("Beim Versuch, auf die neuste Version zu prüfen das Programm zu aktualisieren ist ein Fehler aufgetreten.", 0 + 48, "Fehler")
      7. End Try


      Damit wird überprüft ob der PC mit einem Netzwerk verbunden ist.

      Zwischen 'Then' und 'Else' schreibt ihr nun:

      VB.NET-Quellcode

      1. Dim y As String
      2. Dim Web As New WebClient
      3. Dim Update As String = Web.DownloadString("IZV")


      Damit wird der Inhalt ver Verion.txt als String heruntergeldan, in diesem Fall '1.0.0.0'

      Dann schreibt ihr weiter:

      VB.NET-Quellcode

      1. If My.Computer.FileSystem.FileExists(System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "PZP") Then
      2. My.Computer.FileSystem.DeleteFile(System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "PZP")
      3. End If


      Nun wird überprüft ob die Setup.exe bereits vorhanden ist.
      Sie wird gegebenenfalls gelöscht.

      VB.NET-Quellcode

      1. If Update.Contains(Application.ProductVersion) Then
      2. Else
      3. y = MsgBox("Neue Version. Jetzt herunterladen ?", 4 + 48, "Neue Version")
      4. If y = "6" Then
      5. My.Computer.Network.DownloadFile("IZP", System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "PZP")
      6. Process.Start(System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "PZP")
      7. Me.Close()
      8. End If
      9. End If


      Nun wird überprüft ob der heruntergeladene String mit dem Inhalt '1.0.0.0' der selbe ist,
      wie die beiden Versionen in den Projekteigenschaten.
      Ist dies Der Fall wird fortgefahren, falls nicht kommt eine Messagebox die fragt,
      ob die neue Version heruntergeladen und installiert werden soll. Wenn nun ja gedrückt wird,
      wird die Datei in den Pfad PZP gespeichert und gestartet.
      Danach wird das Programm geschlossen.

      Nun noch

      VB.NET-Quellcode

      1. End If
      anhngen und alles funktioniert...

      Ich hoffe ich konnte helfen :)
      "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

      Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!

      Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Ninoxo“ () aus folgendem Grund: Überprüfung nun mit Ping.

      Also das mit dem Network = isAviable ist so eine Sache.
      Das prüft nur ob du mit einem Netzwerk verbunden bist, was noch nicht heißt, dass du auch eine Internetverbindung hast.

      LG
      Ja, ich weiß...

      Ist aber zumindest eine kleine Absicherung :P
      "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

      Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!

      Ninoxo schrieb:

      Ist aber zumindest eine kleine Absicherung :P
      ...die aber bei einem Update völlig sinnfrei ist.

      Ich würde lieber eine Website z.B. Google anpingen und schauen ob es geht oder nicht.

      LG

      VB.NET-Quellcode

      1. If Update.Contains(Application.ProductVersion) Then
      2. Else


      Lässt sich einfacher lösen mit

      VB.NET-Quellcode

      1. If Not


      Zum Thema Ping würd ich einfach den Pfad zur .exe auf dem Server "an Pingen".


      Lg und frohes Fest
      Tobi

      Gutes Tutorial, und gut erklärt was für was ist.



      Nur hab ich jetzt das Problem, bei mir kommt der Fehler das "Update" kein Ausdruck ist. "Web.DownloadString" funkt auch net wirklich :/ Hatte es mal mit "Web.SatusText" versucht aber hat net geklappt. Bin erst einsteiger in Visual Basic und deshalb net gleich ganz gecheckt was ich mach ...
      Habe VB 2010 und weiß das, dass Tut nur für 2008 ist aber wollt nurn Updater haben.

      VB.NET-Quellcode

      1. If My.Computer.Network.IsAvailable = True Then
      2. Dim y As String
      3. Dim Web As New WebBrowser
      4. Dim Update As String = Web.DownloadString("http://nightforge.square7.ch/patch/Version.txt")
      5. End If
      6. If My.Computer.FileSystem.FileExists(System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "C:\ViPMT2-reloaded Easy Itemshop.exe") Then
      7. My.Computer.FileSystem.DeleteFile(System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "C:\ViPMT2-reloaded Easy Itemshop.exe")
      8. End If
      9. If Update.Contains(Application.ProductVersion) Then
      10. MsgBox("Es ist eine neue Version verfügbar, jetzt Herunterladen?", MsgBoxStyle.YesNo, "Update")
      11. If MsgBoxResult.Yes Then
      12. My.Computer.Network.DownloadFile("http://nightforge.square7.ch/patch/ViPMT2-reloaded Easy Itemshop.exe", System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "PZP")
      13. Process.Start(System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "C:\ViPMT2-reloaded Easy Itemshop.exe")
      14. Me.Close()
      15. Else
      16. If MsgBoxResult.No Then
      17. Me.Close()
      18. End If
      19. End If
      20. End If
      Ich weiß, woran das liegt, das Upadte nicht angenommen wird, dass liegt daran, dass Dim Update as New ... in der If-Schleife ist und so nicht von den anderen genutzt werden kann. Mach das einfach mal über das: If My.Computer.Network.IsAvoible, dann klappt das auch alles eigentlich.

      Aber bei mir funktioniert es allgemein nicht. Bei mir möchte er den Pfad zu der Datei nicht akzeptieren, aber egal, ich bastel an meinem eigenen Update ^^

      MfG. Marin
      Hallo

      Habe das gleiche Problem wie d4z013 ich benutze auch VB10 und wollte das mal hiermit ausprobieren weil das eigendlich ganz leicht klingt. Vielleicht kann man das ja so umschreiben damit das funktioniert. Ich habe das schon versucht, nur wie das nun mal ist ein totaler anfänger findet nicht so schnell eine andere lösung wie ihr Profis ^^

      Ich hoffe uns kann einer helfen und bedanke mich schonmal im Vorraus

      MfG Germanys-Life
      Hey.

      Ich nehm jetzt mla den Code von d4z013 zum Beispiel:

      VB.NET-Quellcode

      1. Imports System.Net
      2. Public Class Form1
      3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      4. Dim y As String
      5. Dim Web As New WebClient
      6. Dim Update As String = Web.DownloadString("Dein Pfad zur Datei mit der Version (Version.txt")
      7. If My.Computer.FileSystem.FileExists("Dein Pfad") Then
      8. My.Computer.FileSystem.DeleteFile("Dein Pfad")
      9. End If
      10. If Update.Contains(Application.ProductVersion) Then
      11. MsgBox("Es ist eine neue Version verfügbar, jetzt Herunterladen?", MsgBoxStyle.YesNo, "Update")
      12. If MsgBoxResult.Yes Then
      13. My.Computer.Network.DownloadFile("Die Datei auf deinem FTP Server", "Dein Pfad + \Datei.exe")
      14. Process.Start("Dein Pfad + \Datei.exe")
      15. Me.Close()
      16. Else
      17. If MsgBoxResult.No Then
      18. Me.Close()
      19. End If
      20. End If
      21. End If
      22. End Sub
      23. End Class


      So sollte es gehen.
      Ich hoffe, dass ich helfen konnte.

      MfG. Marin
      hallo

      ich habe mir nun ein anderen updater programmiert, der auch funktioniert.

      Nur jetzt habe ich ein Problem ich möchte eine Abfrage machen ob der rechner mit dem Internet verbunden ist.

      Er soll meine HP, wo der updater drauf liegt, anpingen wenn der ping erfolgreich ist soll er denn Updater starten, wenn nicht erfolgreich soll er eine MsgBox rausgeben mit "Du bist nicht mit dem Internet verbunden!" und dann soll die alter version weiterlaufen.

      Hat da einer eine idee wie ich das machen könnte.

      Hier einmal mein bisheriger code:

      VB.NET-Quellcode

      1. If My.Computer.Network.Ping("hp-hosting.de") Then
      2. Try
      3. httpclient = New WebClient
      4. Dim URL As String = "http://hp-hosting.de/programme/kartenrangliste/update.exe"
      5. Application.DoEvents()
      6. httpclient.DownloadFileAsync(New Uri(URL), Pfad)
      7. Application.DoEvents()
      8. Catch ex As Exception
      9. MsgBox("Es ist folgender Fehler aufgetreten:" & vbNewLine & ex.ToString, MsgBoxStyle.Critical, "Es ist ein fehler aufgetreten!")
      10. End
      11. End Try
      12. Else
      13. MsgBox("Du bist nicht mit dem Internet verbunden", MsgBoxStyle.Critical, "Problem")
      14. End If


      Ich erläutere nochmal das genaue Problem und zwar wenn ich das ausführe mit Internetverbindung klappt alles perfekt, wenn ich aber das Programm ohne Internetverbindung ausführe kommt dieser Fehler:

      Spoiler anzeigen
      Informationen über das Aufrufen von JIT-Debuggen
      anstelle dieses Dialogfelds finden Sie am Ende dieser Meldung.

      ************** Ausnahmetext **************
      System.InvalidOperationException: Pingfehler. Es ist keine Netzwerkverbindung verfügbar.
      bei Microsoft.VisualBasic.Devices.Network.Ping(String hostNameOrAddress, Int32 timeout)
      bei Microsoft.VisualBasic.Devices.Network.Ping(String hostNameOrAddress)
      bei Updater.Form1.Form1_Load(Object sender, EventArgs e)
      bei System.EventHandler.Invoke(Object sender, EventArgs e)
      bei System.Windows.Forms.Form.OnLoad(EventArgs e)
      bei System.Windows.Forms.Form.OnCreateControl()
      bei System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
      bei System.Windows.Forms.Control.CreateControl()
      bei System.Windows.Forms.Control.WmShowWindow(Message& m)
      bei System.Windows.Forms.Control.WndProc(Message& m)
      bei System.Windows.Forms.ScrollableControl.WndProc(Message& m)
      bei System.Windows.Forms.Form.WmShowWindow(Message& m)
      bei System.Windows.Forms.Form.WndProc(Message& m)
      bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
      bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
      bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


      ************** Geladene Assemblys **************
      mscorlib
      Assembly-Version: 4.0.0.0.
      Win32-Version: 4.0.30319.1 (RTMRel.030319-0100).
      CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll.
      ----------------------------------------
      Updater
      Assembly-Version: 1.1.0.0.
      Win32-Version: 1.1.
      CodeBase: file:///C:/Users/Sven/Desktop/Updater.exe.
      ----------------------------------------
      Microsoft.VisualBasic
      Assembly-Version: 10.0.0.0.
      Win32-Version: 10.0.30319.1 built by: RTMRel.
      CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualBasic/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll.
      ----------------------------------------
      System
      Assembly-Version: 4.0.0.0.
      Win32-Version: 4.0.30319.1 built by: RTMRel.
      CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll.
      ----------------------------------------
      System.Core
      Assembly-Version: 4.0.0.0.
      Win32-Version: 4.0.30319.1 built by: RTMRel.
      CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll.
      ----------------------------------------
      System.Windows.Forms
      Assembly-Version: 4.0.0.0.
      Win32-Version: 4.0.30319.1 built by: RTMRel.
      CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll.
      ----------------------------------------
      System.Drawing
      Assembly-Version: 4.0.0.0.
      Win32-Version: 4.0.30319.1 built by: RTMRel.
      CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll.
      ----------------------------------------
      System.Runtime.Remoting
      Assembly-Version: 4.0.0.0.
      Win32-Version: 4.0.30319.1 (RTMRel.030319-0100).
      CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Runtime.Remoting/v4.0_4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll.
      ----------------------------------------
      System.Configuration
      Assembly-Version: 4.0.0.0.
      Win32-Version: 4.0.30319.1 (RTMRel.030319-0100).
      CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll.
      ----------------------------------------
      System.Xml
      Assembly-Version: 4.0.0.0.
      Win32-Version: 4.0.30319.1 built by: RTMRel.
      CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll.
      ----------------------------------------
      Microsoft.VisualBasic.resources
      Assembly-Version: 10.0.0.0.
      Win32-Version: 10.0.30319.1 built by: RTMRel.
      CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualBasic.resources/v4.0_10.0.0.0_de_b03f5f7f11d50a3a/Microsoft.VisualBasic.resources.dll.
      ----------------------------------------
      System.Windows.Forms.resources
      Assembly-Version: 4.0.0.0.
      Win32-Version: 4.0.30319.1 built by: RTMRel.
      CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_de_b77a5c561934e089/System.Windows.Forms.resources.dll.
      ----------------------------------------
      mscorlib.resources
      Assembly-Version: 4.0.0.0.
      Win32-Version: 4.0.30319.1 (RTMRel.030319-0100).
      CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_de_b77a5c561934e089/mscorlib.resources.dll.
      ----------------------------------------

      ************** JIT-Debuggen **************
      Um das JIT-Debuggen (Just-In-Time) zu aktivieren, muss in der
      Konfigurationsdatei der Anwendung oder des Computers
      (machine.config) der jitDebugging-Wert im Abschnitt system.windows.forms festgelegt werden.
      Die Anwendung muss mit aktiviertem Debuggen kompiliert werden.

      Zum Beispiel:

      <configuration>
      <system.windows.forms jitDebugging="true" />
      </configuration>

      Wenn das JIT-Debuggen aktiviert ist, werden alle nicht behandelten
      Ausnahmen an den JIT-Debugger gesendet, der auf dem
      Computer registriert ist, und nicht in diesem Dialogfeld behandelt.


      Ich hoffe mir kann einer bei diesem Problem helfen

      MfG Germanys-Life
      Würde auf das fehlende www. tippen ....

      Hab mal gegoogelt.

      msdn.microsoft.com/de-de/library/ms184579%28v=VS.90%29.aspx

      Dort heisst es, dass eine Netzwerkverbindung vorhanden sein soll, damit dieser Befehl ausgeführt werden kann.
      Netzwerk = ja, Internet = nein.

      So verstehe ich das. Oder irre ich mich?
      Grüße JackCimberly

      Deine Anfrage erledigt?
      Als erledigt markieren

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

      also ich habe für den updater eine extra form,die ich dan einem belibigen programm beifügen kann....

      der coder:

      VB.NET-Quellcode

      1. Imports System.Net
      2. Public Class Form1
      3. Private WithEvents httpclient As WebClient
      4. Dim pfad As String = Nothing
      5. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      6. ShowDialog:
      7. SaveFileDialog1.ShowDialog()
      8. If SaveFileDialog1.FileName = Nothing Then
      9. GoTo ShowDialog
      10. End If
      11. pfad = SaveFileDialog1.FileName
      12. Try
      13. httpclient = New WebClient
      14. Dim URL As String = "die datei die bei einem upload heruntergeladen werden soll"
      15. Me.Show()
      16. Application.DoEvents()
      17. httpclient.DownloadFileAsync(New Uri(URL), pfad)
      18. Application.DoEvents()
      19. Catch ex As Exception
      20. MsgBox("Es ist Folgender Fehler aufgetretten:" & vbNewLine & ex.ToString, MsgBoxStyle.Critical, "Es ist ein fehler aufgetretten!")
      21. End
      22. End Try
      23. End Sub
      24. Private Sub httpclient_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles httpclient.DownloadFileCompleted
      25. MsgBox("Die Aktuelle Version wurde runtergeladen!", MsgBoxStyle.Information, "Erfolg!")
      26. Shell(pfad)
      27. End
      28. End Sub
      29. End Class


      Und dan noch den Coder der in das Programm selber kommt:

      VB.NET-Quellcode

      1. My.Computer.Network.DownloadFile("die textdatei mit versionsnummer(auf dem server)", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "speichername zb version.ini", "", "", False, 60000, True)
      2. Dim MeineVersion As Integer = CInt(Me.version.Text)
      3. Dim ServerVersion As Integer = My.Computer.FileSystem.ReadAllText(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\version.ini")
      4. If ServerVersion > MeineVersion Then
      5. My.Computer.FileSystem.WriteAllBytes(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\update.exe", My.Resources.downloader, False)
      6. MsgBox("Update wird ausgeführt", MsgBoxStyle.Information, "Update")
      7. Shell(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\update.exe") 'die form die vorher eingebunden wurde
      8. End
      9. End If


      naja so klappts bei mir :P
      Hallo nsjdvv

      so wie dein Updater geschrieben ist ist meiner auch außer das ich den SaveDialog rausgenommen haben weil er das update zum Hauptprogrammpfad legen soll.

      SO und jetzt wieder zurück zum Thema:

      Ich habe das jetzt nochmal ausprobiert mit "www." und da kommt dann ein "Programm reagiert nicht mehr" Fehler.
      Da habe ich die abfrage rausgenommen und das so wie nsjdvv geschrieben halt außer SaveDialog und da kommt das gleiche.

      Vll weiß ja noch eine 3. eine Lösung um zu testen ob der rechner auf dem updater zugreifen kann

      MfG Germanys-Life
      Ich möchte gerne die Datei beim gleichen Pfad speichern. Wie funktioniert das mit applicationpath?

      VB.NET-Quellcode

      1. My.Computer.Network.DownloadFile("http://www.xyzxyzxyzxyz", "Dein Pfad + \Datei.exe")
      2. Process.Start("Dein Pfad + \Datei.exe")

      Also was muss ich bei Dein Pfad + \Datei.exe einsetzen?

      EDIT: Hat sich erledigt

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