Update Benachrichtigung Nur Anzeigen wenn ein neues Update verfügbar ist

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 41 Antworten in diesem Thema. Der letzte Beitrag () ist von Akanel.

    Update Benachrichtigung Nur Anzeigen wenn ein neues Update verfügbar ist

    Hallo,

    ich habe ein kleines Problemchen, die Lösung will mir einfach nicht in den Kopf.
    Ich habe auf meinen FTP Server eine Datei "version.txt" Dort steht drin welche die Neuste Version des Programmes ist.



    Nun möchte ich jedoch das die Update Meldung nur kommt, wenn es wirklich eine neue Version gibt.
    Wie kann ich das Lösen ohne alles ändern zu müssen.

    Hier der betreffende Code

    VB.NET-Quellcode

    1. Private Sub Startparameter()
    2. Dim i As Integer = 0
    3. For Each s As String In Environment.GetCommandLineArgs
    4. If i > 0 Then
    5. Select Case s
    6. Case "-update"
    7. Panel3.Show() 'Hier wird das Panel geöffnet, wo die Abfrage der Version gemacht wird
    8. Case "readend"
    9. Button9.PerformClick()
    10. End Select
    11. End If
    12. i += 1
    13. Next
    14. Using web = New WebClient() With {.Proxy = Nothing}
    15. Dim NewsTxt = web.DownloadString("http://andy2002.de/user/AndyNET/Locales/version.txt") ' Hier liegt die Datei
    16. Label20.Text = NewsTxt ' Hier wird der Inhalt der Datei Anzegeigt
    17. End Using
    18. GC.Collect()
    19. End Sub
    20. Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click 'Beenden Knopf für Panel3
    21. Panel3.Hide()
    22. Timer2.Stop()
    23. GC.Collect()
    24. End Sub
    Unter anderen Umständen hätte ich Akanel widersprochen, aber der Code lässt befürchten, dass viele Sachen updatetechnisch unbeachtet sind. Was hat der Code mit dem Update zu tun? Nichts. Aber der Code enthält so viele unausgereifte Sachen, dass man schlussfolgern kann, dass es beim Update-Code genauso unsauber dahergeht. Und Updates sind immer ein Sicherheitsrisiko.
    • For Each s As String ... Und dann benutzt Du i noch zusätzlich als Zählvariable. Dann nimm gleich ne normale For-Loop her.
    • Das Panel3 und Co. könnte man noch durchgehen lassen. Aber Button9 ist benennungstechnisch so undurchsichtig, dass der Leser (und damit meine ich vor allem Dich selbst) da irgendwann drüber stolpert, weil er nicht weiß, was da drin passiert.
    • PerformClick: Anstatt den Inhalt des Button-EventHandlers in eine Prozedur mit klarem Namen zu packen und diese dann in Zeile#11 und #28 aufzurufen, wird virtuell auf einen ominösen Button geklickt.
    • Z#23, #30: Ohne verdammt guten Grund ist das eine Zeile, die nicht in den Code gehört.
    zum Problem selbst: Lade doch zuerst den Versionsstring runter, vergleiche ihn mit dem App-Versionsstring und wenn beide gleich sind, verlasse die Prozedur, bevor es mit der For-Schleife losgeht. Und nach der Schleife kannst Du den Web-Versionsstring immer noch dem Label-Text zuordnen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:


    zum Problem selbst: Lade doch zuerst den Versionsstring runter, vergleiche ihn mit dem App-Versionsstring und wenn beide gleich sind, verlasse die Prozedur, bevor es mit der For-Schleife losgeht. Und nach der Schleife kannst Du den Web-Versionsstring immer noch dem Label-Text zuordnen.

    Hi ja und genau da hab ich eine denk Blockade. Ein Beispiel wäre schön.
    Zu euren anderen Anmerkungen, For Schleifen nehme ich selten, nur wenn wirklich Notwendig.
    Die Benennung ist meine Sache. GC Collect verwende ich wegen der Speicherverwaltung. <- Bei Größeren Anwendungen Hilfreich. Ok ich habe hier euch nur ein code snipsel gegeben, GC Collect und andere Funktionen werden wo anders Definiert und Angepasst. Da dies jedoch nicht zum Problem gehört hab ich das Natürlich nicht mitkopiert. Oder hättet Ihr Bock 4000 Zeilen code zu Lesen?
    PS: Für euch hab ich ja Extra eine Benennung neben den Codes geschrieben.. Damit ihr das findet.
    Ja der Code ist nicht für das Updaten zuständig, dieser soll nur die Versionen vergleichen, und bei Unterschiedlichen Versionen eben, Panel3 öffnen. bei gleichen Versionen Panel 3 Hiden.
    Und nein der Updater, verwendet RSA und wird mit meinen SSL Server Zertifikat überprüft.
    Ähnlich dem nUpdater nur besser. :D
    Also für ne Lösung wäre ich dankbar, ansonsten muss ich genauer überlegen wie ich das löse.

    Andy2002 schrieb:

    Ein Beispiel wäre schön.
    Eh ... ja. Ok. Da scheint wohl eine größere Blockade vorzuliegen.

    VB.NET-Quellcode

    1. Private Sub Startparameter()
    2. Dim NewsTxt As String = Nothing
    3. Using web = New WebClient() With {.Proxy = Nothing}
    4. NewsTxt = web.DownloadString("http://andy2002.de/user/AndyNET/Locales/version.txt") ' Hier liegt die Datei
    5. End Using
    6. If CurrentVersion.ToString = NewsTxt Then Return 'wie Du in Deiner App CurrentVersion definierst, obliegt Dir.
    7. Dim i As Integer = 0
    8. For Each s As String In Environment.GetCommandLineArgs
    9. If i > 0 Then
    10. Select Case s
    11. Case "-update"
    12. Panel3.Show() 'Hier wird das Panel geöffnet, wo die Abfrage der Version gemacht wird
    13. Case "readend"
    14. Button9.PerformClick()
    15. End Select
    16. End If
    17. i += 1
    18. Next
    19. Label20.Text = NewsTxt ' Hier wird der Inhalt der Datei Anzegeigt
    20. GC.Collect()
    21. End Sub
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Andy2002 schrieb:

    Ähnlich dem nUpdater nur besser.


    Mag jetzt überheblich sein, aber das kann ich nur sehr schwer glauben. Ein Beweis würde mich allerdings umstimmen können.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Oh man echt... Ja irgendwie hatte ich ne Blockade. Vorliegen.

    Edit:
    Habe es nun erst mal so. Funktioniert, ist aber noch nicht schön, da das Fenster trotzdem noch geöffnet wird, also Panel3.

    VB.NET-Quellcode

    1. rivate Sub Startparameter()
    2. Dim NewsTxt As String = Nothing
    3. Dim CurrentVersion As String
    4. Using web = New WebClient() With {.Proxy = Nothing}
    5. NewsTxt = web.DownloadString("http://andy2002.de/user/AndyNET/Locales/version.txt")
    6. End Using
    7. CurrentVersion = My.Resources.version
    8. If CurrentVersion.ToString = NewsTxt Then Return
    9. Dim i As Integer = 0
    10. For Each s As String In Environment.GetCommandLineArgs
    11. If i > 0 Then
    12. Select Case s
    13. Case "-update"
    14. Panel3.Show()
    15. Case "readend"
    16. Button9.PerformClick()
    17. End Select
    18. End If
    19. i += 1
    20. Next
    21. Label20.Text = NewsTxt
    22. GC.Collect()
    23. End Sub


    *Unnötiges Vollzitat entfernt* ~NoFear23m

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Nofear23m“ ()

    Es wird angezeigt, wenn CurrentVersion.ToString <> NewsTxt . Stellt sich die Frage, warum es dann nicht angezeigt werden soll. Also effektiv wird das Panel angezeigt, wenn der runtergeladene String ungleich des Versionsstrings in den Settings ist und wenn das Programm mit dem Parameter -update gestartet wird. Passt doch, oder?
    Oder greift der String-Vergleich nicht so, wie erwartet?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Also so wie ich es nun habe, wird das Panel gar nicht mehr Angezeigt, weder bei gleicher Version, noch bei unterschiedlicher Version.. ???? *Kopf Qualm*

    VB.NET-Quellcode

    1. Form Load Event
    2. Startparameter() ' Hier soll es ausgeführt werden
    3. Private Sub Startparameter()
    4. Dim NewsTxt As String = Nothing
    5. Dim CurrentVersion As String
    6. Using web = New WebClient() With {.Proxy = Nothing}
    7. NewsTxt = web.DownloadString("http://andy2002.de/user/AndyNET/Locales/version.txt") ' Neue Version extern
    8. End Using
    9. CurrentVersion = My.Resources.version ' Aktuelle Version im Programm als Ressource Text
    10. If CurrentVersion.ToString = NewsTxt Then Return
    11. Dim i As Integer = 0
    12. For Each s As String In Environment.GetCommandLineArgs
    13. If i > 0 Then
    14. Select Case s
    15. Case "-update"
    16. Panel3.Visible = True
    17. Case "readend"
    18. Panel3.Visible = False
    19. End Select
    20. End If
    21. i += 1
    22. Next
    23. Label20.Text = NewsTxt
    24. Label18.Text = CurrentVersion
    25. GC.Collect()
    26. End Sub


    Also entweder bin ich gerade wirklich dumm und finde den Fehler nicht, oder die Blockade ist so stark das ich erst mal Pause machen muss..

    Edit: Eigentlich wollte ich es so Umsetzen wie die Server Abfrage

    VB.NET-Quellcode

    1. Form Load Event
    2. If Testconnection() = 1 Then
    3. PictureBox3.Visible = True
    4. PictureBox4.Visible = False
    5. Else
    6. If Testconnection() = 0 Then
    7. PictureBox3.Visible = False
    8. PictureBox4.Visible = True
    9. End If
    10. End If
    11. Private Function Testconnection()
    12. Try
    13. My.Computer.Network.Ping("www.andy2002.de")
    14. Return 1
    15. Catch ex As Exception
    16. Return 0
    17. End Try
    18. End Function
    Dann setz nen Haltepunkt in Codeblock#1, Zeile#14, um zu sehen, was die beiden Variablen für den Textvergleich enthalten und dann noch einen Haltepunkt in der nächsten Zeile. Dann siehst Du ja, ob der Code überhaupt mal bis zum Panel-Show kommt. Und dann eben noch nen Haltepunkt bei CB#1, Z#20, um zu sehen, ob das Programm dort auch vobeikommt.
    CB#2 könntest Du - falls das tatsächlich Dein echter Code ist, vereinfachen. Die Z#3-#11 kannst Du vereinfachen zu:

    VB.NET-Quellcode

    1. Dim TestConnectionResult = Testconnection
    2. PictureBox3.Visible = TestConnectionResult = 1
    3. PictureBox4.Visible = TestConnectionResult = 0

    Was das jetzt allerdings mit dem anderen CB zu tun hat, verstehe ich momentan nicht. Ist wohl zu früh am Morgen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hi ne die Funktion Testconnection hatte ich als Beispiel gepostet, denn eig. wollte ich meine Funktion mit den Version abgleich genau so machen.
    Zu den Haltepunkten, ja das Programm kommt daran vorbei, ruft aber Panel3 nicht auf. Aus einen unerfindlichen Grund springt, es zu Case readend
    Dann gibt es also ein Problem mit den CommandLineArguments. Also:

    VB.NET-Quellcode

    1. If CurrentVersion.ToString = NewsTxt Then Return
    2. Dim i As Integer = 0
    3. Dim Args = Environment.GetCommandLineArgs
    4. 'In der nächsten Zeile einen Haltepunkt setzen ...
    5. For Each s As String In Environment.GetCommandLineArgs

    ...und schauen, was so in Args drinsteht
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Geil, jetzt wird jemandem der einen Super Updater geschrieben hat, erstmal erklärt wie man richtig Debuggt. ,
    Debuggen, Fehler finden und beseitigen
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hi,
    also ich versteh deine Funktion nicht, wo kommen denn die CommandlineArguments her?
    du willst doch das das Panel3 angezeigt wird, wenn CurrentVersion <> NewsText ist, dann frag das doch ab

    VB.NET-Quellcode

    1. ​Panel3.Visible = CurrentVersion <> NewsText
    "Hier könnte Ihre Werbung stehen..."
    Öhm, ist ja nicht mein Programm, aber wenn eben nix in den CommandLineArgs steht ... dann soll vielleicht gar nix passieren? Wir kennen nicht den ganzen 4000-Zeilen-Code. Mir ist klar, dass es bei einer Panel-Anzeile nur an oder aus gibt. Aber die CommandLineArgs sollen ausgewertet werden. Vorgabe vom TE.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    MichaHo schrieb:

    Hi,
    also ich versteh deine Funktion nicht, wo kommen denn die CommandlineArguments her?
    du willst doch das das Panel3 angezeigt wird, wenn CurrentVersion <> NewsText ist, dann frag das doch ab

    VB.NET-Quellcode

    1. Panel3.Visible = CurrentVersion <> NewsText


    Hab ich mal so ausprobiert. Genau das will ich ja erreichen, und eben wenn CurrrentVersion = Newstxt ist dann Panel.Visible False, ist CurrentVersion undgleich Newstxt dann Panel.Visible True.
    Edit: Natürlich sind CurrentVersion und Newstxt als String zu behandeln, so bekommt man auch die Möglichkeit sie als Label Visualisieren zu können.
    Der weg dahin ist völlig Egal. Die CommandLineArguments rufe ich Aktuell mit -update und readend ab. Aber das ist kein muss, wenn es einen einfacheren und Schnelleren weg gibt. Ich bin für Ideen offen.


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

    What the Förg?

    VB.NET-Quellcode

    1. Panel3.Visible = True = CurrentVersion <> NewsTxt
    2. Panel3.Visible = False = CurrentVersion = NewsTxt
    :?: :!: :?:

    Wenn, dann muss es nur heißen:

    VB.NET-Quellcode

    1. Panel3.Visible = CurrentVersion <> NewsTxt

    das ganze Unterfangen, inkl. »sicherer Updater, besser als nUpdate«: ridiculous absurd
    Da klaffen Anspruch und Realität zu weit auseinander. Ich verabschiede mich.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hab ich gerade mal mit gespielt. :D

    VB.NET-Quellcode

    1. Panel3.Visible = CurrentVersion <> NewsTxt

    Klappt nicht und

    VB.NET-Quellcode

    1. Panel3.Visible = True = CurrentVersion <> NewsTxt
    2. Panel3.Visible = False = CurrentVersion = NewsTxt

    Ebenfalls nicht..

    Ich fummel halt gerne, da es noch zu keiner Lösung gekommen ist. Und NEIN das ganze hat alles Absolut nichts mit Irgendeinen Updater zu tun. Mal so 0% Es werden nur Versionen verglichen.
    Und ja ich habe einen Updater, der ist aber absolut nicht Gegenstand der Frage und daher auch ohne Diskussion hinzunehmen. Ich verstehe euch sowieso nicht, sobald jemand Version, updater oder sonst wie eine Frage stellt wird hier im Forum direkt geblockt, und auf Fertige Tools verwiesen.
    Auch wenn es absolut nichts mit der Frage zu tun hat. Ich Frage ja nur nach einen einfachen String vergleich, da ich es irgendwie nicht in meinen Kopf bekomme. Und das obwohl ich so etwas schon oft gemacht hatte.

    VB.NET-Quellcode

    1. Private Sub AufUpdatePrüfenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AufUpdatePrüfenToolStripMenuItem.Click
    2. Updater.Show()
    3. Me.Hide()
    4. End Sub

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

    Andy2002 schrieb:

    Und nein der Updater, verwendet RSA und wird mit meinen SSL Server Zertifikat überprüft.
    Nun, mindestens 2 Leute implizierten aus diesem von Dir in Post#4 geschriebenen Satz, dass Du grad dabei bist, Deinen eigenen Updater zu programmieren und dass es in diesem Thread aber nur um einen Teilcode geht.

    Andy2002 schrieb:

    der Code ist nicht für das Updaten zuständig, dieser soll nur die Versionen vergleichen, und bei Unterschiedlichen Versionen eben, Panel3 öffnen
    Gut, dass es nun durch Post#19 endlich klargestellt wurde, dass der Updater nicht von Dir ist und nichts mit Deinem Code zu tun hat.

    Andy2002 schrieb:

    Panel3.Visible = CurrentVersion <> NewsTxt
    Klappt nicht
    Was soll das heißen? Wenn Du einen Haltepunkt in der darauffolgenden Zeile setzt und dann schaust, in welchem Zustand Panel3 ist, also sichtbar oder unsichtbar, dann weißt Du, wonach Du bei dem Text-/Stringvergleich schauen musst. Falls das nicht so richtig will (warum auch immer), dann kannst Du es auch anders machen:

    VB.NET-Quellcode

    1. MessageBox.Show("derzeitiger Versionsstring: »" & CurrentVersion & "«, Versionsstring auf dem Server: »" & NewsTxt & "«. Diese beiden Strings sind" & If(CurrentVersion = NewsTxt, "", " NICHT") & " gleich.")


    Dass der von mir zitierte Codeblock nicht funktioniert: Ja, sorry. Der kam ja auch von Dir*. Würde der funktionieren, hätte ich ihn nicht korrigiert.

    ##########

    btw: Dein Codeblock#3 schreit nach Dialoge richtig instanziieren

    * den Teil aus Post#17 rauszulöschen, nachdem ich ihn in Post#18 zitiert habe, ist provokant.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()