Laden...

C# Anwendung sich selbst updaten lassen

Erstellt von Larry86 vor 14 Jahren Letzter Beitrag vor 14 Jahren 5.658 Views
L
Larry86 Themenstarter:in
7 Beiträge seit 2009
vor 14 Jahren
C# Anwendung sich selbst updaten lassen

Halli hallo ihr wissenden Programmierer da draußen.
Ich hab ein kleines Problem, dass mich fast verrückt macht.
Und zwar möchte ich es erreichen, dass meine .Net (C#) Anwendung sich selbst updaten kann.
Ich hatte mir gedacht, dass meine EXE einfach eine .BAT Datei erstellt und diese dann ausführt. Die BAT versucht permanent in einer Schleife die Anwendung zu löschen, was natürlich erst gelingt, wenn die EXE sich beendet hat.
Dann macht die BAT löschen, kopieren usw. und startet die ersetzte Anwendung neu.
Für Delphi hatte ich sowas schonmal geschafft, nur leider habe ich keinen Quelltext mehr dazu.
Ich hatte auch schon bei euch im Forum geschaut und auch eine sehr ähnliche Variante gefunden, nur leider wurde dort nicht mehr erklärt, wie er es gelöst hatte.
(.Exe nach ausführen löschen?)

Mein Code sieht bis dato so aus:

...
if (OwnVersion() != FileVersion("1.1.0.0.exe")) {     //If the file versions are different
            if (File.Exists("updater.bat") == false) {     
                StreamWriter myFile = new StreamWriter("updater.bat",false);
                myFile.WriteLine(":loop");
                myFile.WriteLine("del \"Old.exe\"");
                myFile.WriteLine("if exist \"Old.exe\"  goto loop");
                myFile.WriteLine("copy \"1.1.0.0.exe\" \"Old.exe\"");
                myFile.WriteLine("Start Old.exe");
                myFile.Close();
            }

            Process del = new Process();
            try {
                del.StartInfo.FileName = "updater.bat";
                del.StartInfo.UseShellExecute = false;
                del.Start();

            } catch (Exception) {
                throw;
            }
...

Mir ist klar, dass das nun hardcoded ist, ich hab es nur zu Demonstartionszwecken vereinfacht.
Nur leider funktioniert das nicht so wie ich das gerne hätte. Entweder lande ich in einer Endlosschleife, das die Anwendung (alte Version) immer neu startet, oder sie wird gelöscht und ich bekomm eine Exception, da nun die Datei fehlt, oder,oder,oder...
Wer von euch weiß Rat, bzw. kennt eine bessere Methode zum "Selbstupdate".
Leider darf ich jedoch außer der EXE keine weiteren Dateien (DLL oder EXE) mit ausliefern, und dieses sog. ClickOnce von VS oder wie das heißt, steht auch nicht zur Auswahl.

Schonmal Danke fürs Lesen und für eure Hilfe!
Larry

Ich bin keine Signatur, ich mach hier nur sauber!

Gelöschter Account
vor 14 Jahren

Leider darf ich jedoch außer der EXE keine weiteren Dateien (DLL oder EXE) mit ausliefern

dafür gibt es dann einen trick. bau dir eine updater.exe die das ganze managed und füge sie deinem programm als embedded ressource hinzu. wenn der user dann updaten möchte, extrahierst du diese updater exe und rufst sie auf.

die updater exe holt sich einfach den prozess der hauptanwendung und meldet sich auf das exited-event an. wenn das getriggert wurde, kannst du mit dem update loslegen.

beim start der hauptanwendung überprüfst du ob es eine updater exe gibt und löschst diese dann.

L
Larry86 Themenstarter:in
7 Beiträge seit 2009
vor 14 Jahren

Wow, das war ja eine schnelle Antwort. Und dazu noch eine echt krasse. Ich wusste nichtmal, dass sowas geht.
Nun aber zum peinlichen Teil.
Ich habe geschaut, aber ich scheitere schon am hinzufügen einer EXE als Ressource.
Daher werde ich, denke ich mal, auch Probleme haben die eingebundene Ressource zur Laufzeit wieder zu extrahieren.
Könntest du bitte erklären wie das alles funzt?
Und was meinst du genau mit:

und einfach den prozess der hauptanwendung und meldet sich auf das **exited-event **an. wenn das getriggert wurde."

Ich bin keine Signatur, ich mach hier nur sauber!

Gelöschter Account
vor 14 Jahren

Und was meinst du genau mit:...

schau dir hierzu die Process klasse des frameworks an.

Ich habe geschaut, aber ich scheitere schon am hinzufügen einer EXE als Ressource.
Daher werde ich, denke ich mal, auch Probleme haben die eingebundene Ressource zur Laufzeit wieder zu extrahieren.
Könntest du bitte erklären wie das alles funzt?

wie man dateien als ressource hinzufügt kannst du den tutorials bezüglich embedded ressourcen entnehmen.

Tutorial: C# Embedding Executables into your C# application

edit: gleiches gilt für das extrahieren dieser ressourcen 😉

L
Larry86 Themenstarter:in
7 Beiträge seit 2009
vor 14 Jahren

Oh mann, gestern war ich anscheinend echt müde, wenn ich nicht mal mehr "triggern" verstehe. Habs nun gelöst - mit triggern - . Das Tutorial war echt hilfreich! Danke!

Ich bin keine Signatur, ich mach hier nur sauber!

3.825 Beiträge seit 2006
vor 14 Jahren

Es geht auch viel einfacher :


File.Delete("Applikation.ex1");
File.Move("Applikation.exe","Applikation.ex1");
client.Download("http://www.seven-c.de/files/Applikation.exe","Applikation.exe");

//Wenn was schiefgeht :
File.Move("Applikation.ex1","Applikation.exe");

So kann sich jede Anwendung selbst updaten.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

M
12 Beiträge seit 2009
vor 14 Jahren

Vielleicht kann das hier weiterhelfen:

Der Updater vom Anno 1404 Modification Manager.

Er lädt eine bestimmte *.zip-Datei herunter und versucht alle Dateien, die später aktualisiert werden zu löschen. Nachdem die Dateien entpackt wurden, wird die aktualisierte Anwendung gestartet.

Hinweis: Er hat keine Versionsprüfung. Dies wird durch die Hauptanwendung gemacht

http://tilegame.bplaced.net/Updater.rar

Anno 1404 Modification Manager Download: http://tilegame.bplaced.net/A1404MMDownload.html

1.564 Beiträge seit 2007
vor 14 Jahren

Hi

Noch ein Weg, der einfach funktioniert. Mach' einfach die updater.exe zu "deiner EXE". Heißt, bau eine EXE die prüft ob ein Update verfügbar ist und das dann runterlädt und die bestehende Applikation austauscht. Gib der updater.exe dein Programm-Icon und den Namen deines Programms und lass den Benutzer einfach die Starten statt der eigentlichen Anwendung. Wenn's kein Update gibt startet die Updater-Anwendung einfach die eigentliche Anwendung. 😉

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

4.931 Beiträge seit 2008
vor 14 Jahren

Nur der Vollständigkeit halber:

es gibt auch schon ein vollständiges Projekt, welches sich um das Updaten kümmert: AppDater (ehemals K_Updater)

Man benötigt dafür dann einen WebServer mit PHP 4 oder höher. Die Einbindung in das eigene Programm ist aber relativ einfach.

B
76 Beiträge seit 2007
vor 14 Jahren

Nur der Vollständigkeit halber:

Das Projekt wurde leider, leider, leider eingestellt. 😭

"Fehler sind das Tor zu neuen Entdeckungen"

99 Beiträge seit 2006
vor 14 Jahren

noch eine Ergänzung. Unter Vista kommt wieder UAC in Einsatz, also der updater.exe muss unter Umständen auch als Admin gestartet werden sogar wenn die Anwendung selbst ein einfacher Benutzer startet. Also vollkommen automatisch geht es nicht, es sei denn man sein admin passwort irgendwo speichert.

Persönlich möge ich solche programme nicht die mich nach dem admin passwort fragen...

Grüße
Pawel

3.825 Beiträge seit 2006
vor 14 Jahren

Meine Version funktioniert leider unter Windows 7 nicht mehr.

😦

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3