Ich arbeite an einer Client-Server-Lösung zur Datenerfassung. Damit man nicht bei jedem Update der Clientsoftware - was ja gerade am Anfang häufiger vorkommt - stundenlang mit dem USB-Stick von Client zu Client hirscht, habe ich eine Auto-Update-Methode eingebaut. Dabei wird der Ordner mit der neuen Applikation und sämtlichen DLLs am Server zu einem ZIP-Archiv gepackt, in "Häppchen" zu je 1 MB geschnitten und in einer Tabelle der ohnehin verwendeten MySQL-Datenbank untergebracht (Version, BlockNr, BlockAnz, Daten). Die Clients prüfen in gewissen Abständen, ob es ein Update mit einer neueren Version als die eigene gibt. Wenn ja, lädt der Client die einzelnen Blocks herunter, fügt sie wieder zusammen und entpackt sie in ein Verzeichnis innerhalb des eigenen, mit dem Namen "Update". Das klappt Alles hervorragend. Und genau jetzt kommt das Problem. Eine laufende Applikation kann sich nicht selber löschen und ersetzen, ebensowenig in Benutzung befindliche DLLs. Ich habe da bisher immer noch eine zusätzliche Anwendung gebraucht, die, nachdem sich die Hauptanwendung beendet hat, die aktuellen Dateien gegen die neuen ersetzt und die neue Applikation startet. Das funktioniert, scheint mir aber umständlich. Gibt es dafür eine cleverere Lösung? Ich habe auch mal mit Batchdateien und Shellscripten "herumgemacht", hat im Prinzip funktioniert, aber nicht immer. Ein Problem war z.B., dass es unter Windows anscheinend ein (unterschideliches) Weilchen dauert, bevor die Dateien einer gerade beendeten Applikation nicht mehr schreibgeschützt sind. Tips? Frank
ich weiß nicht genau wie es geht, aber theoretisch kannst du deine anwendung in dem ram legen- und somit von der exe etc abkoppeln, sodass diese nicht mehr schreibgeschützt sind- dann die Updateroutine starten und gut aber ich kenne viele Programme, die auch mit einer 2. exe Datei updaten, weil es einfacher und flotter ist, einfach mal an den zkm aufwand denken ;-) (der hat leider viel mehr zu sagen als die eleganz :( ) mfg
Ich hab das Problem auch immer so gelöst. Das Update wurde heruntergeladen und zusätzlich noch ein Programm, dass nach dem Download und der Beendigung des zu updatenden Programms gestartet wird. Das kleine Programm wartet, bis alle Dateien ersetzt wurden beendet sich dann. Das andere Programm löscht dann den Updater. Ist etwas umständlich, aber funktioniert immer.
Das hilft aber alles nichts, wenn man nicht als Admin arbeitet. Und als Software entwickler sollte man schon darauf achten das das Programm auch mit user rechten arbeitet. Und da kann man keine Schreibrechte in einem Programm verzeichniss. Also scheidet schon mal ein Selbstupdate aus. Wenn ein update auch von einem normalen Anwender gemacht werden soll, dann muss man es über eine Update-Dienst machen. Dieser prüft regelmässig ob ein update gemacht werden muss. Eventuell kann auch die Anwendung das neue Zip laden und dem Dienst übergeben (z.b. im Temp verzeichnis) Der Dienst wartet dann einfach auf das beenden der Anwendung und tauscht die Datein aus. Jetzt bleibt nur noch das Problem zum ausauschen von den Dienst. Wenn er nur aus einer exe besteht kann man diese vorher umbenenne und dann die neue exe hinlegen. Nach dem restart des Dienstes sollte dann die neue Version laufen. Ja das umbenenen geht auch wenn die Anwendung läuft.
nachtrag: In Windows7 hat eine Anwendung im normalfall auch keine Schreibrechte in dem Program verzeichnis, selbst wenn der User ein Admin ist. Sie muss explizit als Administrator gestartet werden damit das geht. Oder die UAC muss deaktiviert werden.
Peter schrieb: > Das hilft aber alles nichts, wenn man nicht als Admin arbeitet. Und als > Software entwickler sollte man schon darauf achten das das Programm auch > mit user rechten arbeitet. Und da kann man keine Schreibrechte in einem > Programm verzeichniss. Also scheidet schon mal ein Selbstupdate aus. > Wenn ein update auch von einem normalen Anwender gemacht werden soll, > dann muss man es über eine Update-Dienst machen. Dieser prüft > regelmässig ob ein update gemacht werden muss. Eventuell kann auch die > Anwendung das neue Zip laden und dem Dienst übergeben (z.b. im Temp > verzeichnis) Der Dienst wartet dann einfach auf das beenden der > Anwendung und tauscht die Datein aus. Jetzt bleibt nur noch das Problem > zum ausauschen von den Dienst. Wenn er nur aus einer exe besteht kann > man diese vorher umbenenne und dann die neue exe hinlegen. Nach dem > restart des Dienstes sollte dann die neue Version laufen. Ja das > umbenenen geht auch wenn die Anwendung läuft. Andere Möglichkeiten ClickThrough (gehört zum Windows Installer XML toolset) http://blogs.msdn.com/b/robmen/archive/2005/11/08/490448.aspx http://wix.sourceforge.net/clickthrough.html oder sieht sich an/nutzt den Updater von Google (je nach Standpunkt sieht man, wie es nicht gehen sollte: Die gesamte Anwendung ala Chrome liegt unterhalb des Benutzerprofils...) http://omaha.googlecode.com/svn/wiki/OmahaOverview.html http://code.google.com/p/omaha/
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.