Konzept für eigenen Online-Updater

RudolfG

Erfahrenes Mitglied
Hallo Leute,

ich möchte gern in mein Programm eine Online-Update funktionalität einbauen, am liebsten eine die ähnlich dem von Firefox ist. Das heißt nach einem Neustart sollen die Updates dann eingespielt/angewandt werden.

Bisherige Idee:
Ich könnte einfach eine zweite Anwendung (AfterUpdateStarter) ins Verzeichnis legen, diese wird von meinem Hauptprogramm nach dem Download der Dateien aufgerufen. Sobald die Hauptanwendung geschlossen wird, beginnt die "AfterUpdateStarter"-Anwendung die "alten" Dateien durch die herruntergeladene Dateien zu ersetzten.

Sobald er damit am Ende ist, wird die AfterUpdateStarte-Exe geschlossen und mein Hauptprogramm wieder geöffnet (in der neuen Version).

Problem:
Was oder wie kann man machen wenn ich durch ein Update die AfterUpdateStarter-Exe aktualisieren möchte (um z. B. erweiterte Logiken, SQL-Scripte auszuführen etc. zur Verfügung zu haben)? Was bzw. wie könnte ich dann das realisieren?

Hoffe so einige Anregungen und Ideen von euch zu bekommen und gemeinsam eine Lösung ggf. sogar mehrere Lösungen dafür zu finden.

Gruß
Rudolf Grauberger
 
1. Möglichkeit: Programmiere den AUS so, dass nur Konfigurationsdateien zu ändern sind, die kannst du dann runterladen (wenn die lokalen geschlossen sind) und sofort verwenden.
2. Möglichkeit: Programmiere den AUS so, dass die exe nur ein kurzes main-stub enthält und lagere alles andere, inklusive der eigentlichen 'main'-Routine in eine 'von Hand' zu ladende dll aus, deren Namen auch eine Versionsnummer beinhaltet. Den Namen der dll lagerst du dann in eine Konfigurationsdatei aus, die du wie in Punkt 1 beschrieben behandeln kannst. Deren main-stub kannst du dann bei Bedarf direkt, je nach Geschmack, von dem main-Stub der alten dll aufrufen oder von dem der exe aufrufen.
 
Hi Vereth,

den zweiten Ansatz finde ich um einiges Interessanter. Allerdings weiß ich nicht genau was bzw. wie ich folgendes zu verstehen habe:

2. ... Deren main-stub kannst du dann bei Bedarf direkt, je nach Geschmack, von dem main-Stub der alten dll aufrufen oder von dem der exe aufrufen.

Währe echt nett wenn du mir das etwas Ausführlicher erklären könntest.

Gruß
Rudolf Grauberger
 
Zuletzt bearbeitet:
Deine exe-Datei enthält eine main-Methode; was das ist, weißt du. Diese main-Methode soll dann nichts anderes tun als eine dll zu laden, die die eigentliche Funktonalität bereitstellt; den Namen entnimmt sie einer Konfigurationsdatei. Sobald diese geladen ist, rufst du deren 'main'-Methode auf (die kannst du natürlich auch anders nennen), welche alle anderen notwendigen Arbeiten durchführt und erst wieder zurückkehrt, wenn das Programm beendet oder neu gestartet werden soll; du lagerst also unter anderem auch all das in die dll aus, was sonst die 'normale' main-Methode tut, z.B. Fenster aufbauen.
Von der dll aus wird dann auch überprüft, ob Updates vorhanden sind, wohin sie gespeichert werden sollen, und führt die notwendigen Schritte aus. Weil auch diese dll selber eventuell durch Updates ersetzt werden muss, diese aber nicht auf der Festplatte überschrieben werden kann, weil sie in Benutzung ist, musst du eine Methodik verwenden, die diese Problematik umgeht. Dafür gibt es zwei Möglichkeiten:
1. Die dll-Dateien haben je nach Version einen eigenen Namen, dadurch vermeidest du Namenskonflikte und kannst die Bibliothek in dem selben Verzeichnis speichern wie alle anderen auch. Das kennst du vielleicht schon von Visual Basic; die Laufzeit-Bibliotheken heißen je nach Version vbrun200.dll, vbrun300.dll etc. Den Namen der aktuell zu verwendenden dll schreibst du dann in eine Konfigurationsdatei; sobald ein Update durchgeführt wurde, aktualisiert die dll auch die Konfigurationsdatei, und teilt der main-Methode der exe-Datei per Returncode mit, dass Neuerungen eingespielt wurden. Die main-Methode schließt dann die dll, liest dann die Konfigurationsdatei aus, um den Namen der aktuellen dll zu erfahren, lädt sie und startet dann deren Einsprungroutine. Diese stellt dann fest, dass alles aktuell ist und startet dann dein eigentliches Programm. Danach kehrt sie mit einem Returncode zur exe-main zurück, der anzeigt, dass nicht mehr zu tun ist; dein AUS ist somit fertig und kann beendet werden.
2. Die dll-Dateien werden in ein eigenes Download-Verzeichnis heruntergeladen. Beim Programmstart wird überprüft, ob Neuerungen dort sind, diese werden dann in das eigentliche bin-Verzeichnis kopiert (oder wie immer du das auch nennen magst) und werden von nun an automatisch verwendet.

Ich persönlich würde die erste Methodik bevorzugen.

Übrigens: du solltest beim Updaten auch berücksichtigen, dass fehlende Schreibrechte dich behindern könnten; wenn du dann immer wieder versuchst, ein Update durchzuführen, könntest du ungewollt eine Endlosschleife produzieren, die verhindern könnte, dass dein eigentliches Programm aufgerufen wird.
 
Das finde ich mal eine sehr gelungene und ausführliche Erklärung! Vielen Dank! :D

Ich persönlich würde die erste Methodik bevorzugen.

Die gefällt mir persönlich auch deutlich besser. :D

Übrigens: du solltest beim Updaten auch berücksichtigen, dass fehlende Schreibrechte dich behindern könnten; wenn du dann immer wieder versuchst, ein Update durchzuführen, könntest du ungewollt eine Endlosschleife produzieren, die verhindern könnte, dass dein eigentliches Programm aufgerufen wird.

Vielen Dank für diesen Hinweis. Da in meinem Programm für ein Update immer die Administrationsrechte notwendig sind, werden die Schreibrechte wohl nicht das problem sein. Aber berücksichtigen werde ich es trotzdem. Danke :D

Gruß
RudolfG
 
Zurück