Automatisches Update über Batch-Datei im Intranet - brauche Hilfe

xMen

Mitglied
Hallo C#-Freunde,

so langsam aber sicher neigt sich meine Anwendung dem Ende entgegen. Jetzt muss ich mich um die Aktualisierung der "dll"- und "exe"-Dateien kümmern und würde das Ganze gerne über eine interne Funktion im Programm für den Anwender bereitstellen.

Ich stelle mir das folgendermaßen vor:
Im Programm gibt es einen Menüpunkt "auf Updates prüfen". Klickt der User den Punkt an und liegen tatsächlich aktualisierte Dateien vor ( -> dass prüfe ich über ein "Service"-Verzeichnis auf dem Server ), kopiere ich die notwendigen Dateien "dll, exe, usw." vom Server in das lokale Verzeichnis der Anwendung und nenne sie dabei natürlich um. Jetzt muss ich den Anwender veranlassen, dass Programm neu zu starten, damit die "Aktualisierungen" verarbeitet werden können. So weit kein Problem!


Mein Ansatz zur Realisierung einer derartigen Funktion wäre, eine "Batch"-Datei oder eine andere "exe"-Datei bereitzustellen, die keine andere Aufgabe hat, als das Hauptprogramm zu starten. Der Anwender startet also über den Desktop nicht das Hauptprogramm, sondern eben diese Batchdatei.

So könnte ich in der "Update"-Anwendnung prüfen, ob "umbenannte" Dateien vorliegen und entsprechend - vor dem Aufruf des Hauptprogramms - darauf reagieren.

Hat jemand so etwas schon einmal realisiert? Ist der Ansatz ok oder gibt es wesentlich elegantere Lösungen für das Problem?

Danke für alle Antworten...
 
Du könntest das auf der Grundlage eines SplashScreens lösen.

Ein Hauptprogramm prüft die Abhängigkeiten ( Alle Programmdateien vorhanden? Internet vohanden? Update verfügbar? ) startet das Programm oder führt gegebenen falls das Update durch (Benutzerabfrage).

MFG cosmo
 
Also ich habe das so gemacht:
Ich prüfe per XML die Versionsdatei und die lokale Datei. Ist eine neue Version vorhanden, dann lade die Datei herunter und nenne sie z.B. programm.exe.tmp nach dem erfolgreichen Update wird das Programm geschlossen falls es noch auf ist, danach wird die programm.exe gelöscht und programm.exe.tmp in programm.exe genannt. Und update zuletzt die lokale Versionsdatei. Das wars :) Wenn du paar Schnipsel brauchst gebe ich sie dir gerne, aber bitte versuch es erstmal alleine, ich saß daran sehr lange bis ich das so hingekriegt habe ich es wollte ;-)
 
Hallo,

@cosmochaosmaker

Ja, ein SplashScreen ist ansich eine gute Idee, hilft aber hier leider nicht weiter, da ich den Screen ja aus der Anwendung aktivieren muss. Solange die Hauptanwendung jedoch aktiv ist, kann ich die Update-Datei ja nicht handeln...

@Counterfeit

Codesnippets brauche ich ( noch :) ) nicht. Ich bin bereits seit gestern dabei, das Problem zu lösen. Dabei habe ich eine Lösung gefunden, mit der sich das Ganze offenbar wunderschön bearbeiten lässt. Das Stichwort heißt: new Process(); Ich bin mir nur noch nicht sicher, ob dies ein Weg ist, auf den man sich 100% verlassen kann... Ich werde meine Erfahrungen hier mal berichten...
 
Ich meinte ja auch nur als Grundlage. Dafür brauchst Du sowieso die Process-Klasse.

Du startest dein Prog. Wenn ein Update verfügbar ist startest Du dein ÜpdateProg und beendest dein Programm.
Du kannst es aber auch vom UpdateProg aus schließen:
Code:
foreach ( Process instance in myProcesses)
	if( instance.MainModule.FileName == sMainProgName)
		pMainProg = instance;
Code:
pMainProg.Close();
oder
pMainProg.CloseMainWindow();
oder
pMainProg.Kill();
Das UpdateProg wartet bis das Hauptprogramm beendet ist.
Danach kannst Du updaten.
Code:
while ( !pMainProg.HasExited )
	Thread.Sleep(0);
Das sollte jedenfalls so funktionieren.

MFG cosmo
 
Kein Problem, helfe gerne. Also ich habe die Komponente mal ausgiebig getestet und finde sie richtig klasse. Überlege gerade ob ich von meinem System auf das hier umsteige :). Das gute ist die Verschmelzung mit den Updates als MSI.
 
Zurück