2009-07-31 15 views
11

Wir haben eine minimale 'Updater' exe, die eine Remote-URL für Updates prüft, sie herunterlädt und Dateien auf der Festplatte ersetzt, bevor die eigentliche Anwendung gestartet wird. Wenn wir jedoch die Updater-EXE und dann AFAIK ersetzen wollen, haben wir zwei Optionen:Die beste Methode zum Implementieren von Self-Updating-Software

1) Shadow Copying Assemblies wobei .Net eine Schattenkopie der EXE (und aller referenzierten Assemblies) erstellt und diese Assemblys lädt, so dass die Schattenbaugruppen können ersetzt werden und werden beim nächsten Start der Anwendung verwendet.

2) Identifizieren Sie, welche Dateien ersetzt werden, und benennen Sie sie auf der Festplatte um. Windows scheint das Umbenennen/Verschieben von gesperrten Dateien zu erlauben, so dass wir die Dateien verschieben und in die neuen Assemblies kopieren können. Beim nächsten Start der Anwendung werden wir die neuen Baugruppen einführen. Dieser Ansatz wird erwähnt here

Ist diese zweite Methode eine empfohlene Methode? Gibt es Fallen für diesen Ansatz?

Antwort

6

Was ist mit ClickOnce Bereitstellung?

+0

Dies ist wahrscheinlich die beste Option, da es helfen sollte, die Sicherheitsstufe Upgrade/Downgrade zu standardisieren erforderlich in Windows Vista und zukünftigen Versionen von Windows –

+0

Wir verwenden ClickOnce für jetzt nicht, da es einfacher war, die beschriebene Dateikopiermethode zu verwenden, und wir haben auch einen angepassten Aktualisierungsprozess für eine SQL-Datenbank, die neben der Anwendung installiert wird. ClickOnce ist jedoch die offizielle Microsoft-Lösung, auf die wir uns mit Blick auf zukünftige Anwendungen konzentrieren werden. Daher wähle ich diese Lösung als akzeptierte Antwort. Vielen Dank. – redcalx

+1

ClickOnce ist ein Albtraum, weil es unflexibel und übermäßig komplex ist, keine starke Microsoft-Unterstützung zu haben scheint und sehr spezifisch für die einzelnen Anwendungsszenarien ist. – jpierson

6

Eine weitere Option: Wenn die Hauptanwendung sich selbst aktualisieren möchte, wird ein neuer Aktualisierungsprozess gestartet, der sich dann selbst beendet. Der erzeugte Prozess wartet in der Zwischenzeit darauf, dass die Hauptanwendung geschlossen wird (der Prozess wird ausgeblendet), und aktualisiert dann alle erforderlichen Dateien (einschließlich der EXE-Datei). Danach startet es einfach die Hauptanwendung neu und beendet den Aktualisierungsprozess.

+0

Klingt vernünftig – jpierson

+0

@jpierson und es funktioniert :). Ich benutze diesen Ansatz seit 2 Jahren für meine eigene Anwendung. –

8

Im mit der zweiten Methode ohne Probleme. Stellen Sie nur sicher, dass die heruntergeladene Assembly korrekt heruntergeladen wurde. ;)

Run Update.exe und lassen Sie es tun:
1. Laden Sie die neue update.exe als update.ex_
2. update.exe umbenennen, um update.bak (Sie es umbenennen, aber überschreibt es nicht)
3. update.ex_ umbenennen dies überhaupt ohne Probleme so getestet, um sein update.exe
4. Neustart update.exe

im tun und in etwa 400 Kunden in Live-Umgebung ausgeführt werden wie wir sprechen.

+0

Wie würde ich das aktuell laufende Programm neu starten? Gibt es einen einfachen Weg? – chillitom

+0

@chilitom: process.start (Application.StartupPath & "\ myprogram.exe"): Ende – Stefan

+0

+1 für einen Kommentar in Schritt # 2 – jpierson

1

Die Art, wie wir es mit unserem hauseigenen App tun:

Die Anwendungsverknüpfung verweist auf den Updater.

  1. Benachrichtigungen zu Ausfallzeiten/Terminmeldungen werden angezeigt.
  2. Der Updater führt eine Aktualisierungsprüfung durch.
  3. Updates werden heruntergeladen und installiert.
  4. Die Anwendung wird gestartet.
  5. Anwendung führt Aktualisierung des Updater (Schecks für Updater.fp7.gz im/Update-Ordner)

Edit: Oops - verpassten Schritt 5.

+2

Sie haben die Frage richtig gelesen? Wie aktualisierst du den Updater selbst in deinem Szenario? –

3

In einem Projekt arbeitete ich an, dort, wo 2 ausführbare Dateien. Nennen wir sie A und B.

Der einzige Grund für A bestand darin, B. zu starten. So, wenn B (die 'echte' Anwendung) ein Update heruntergeladen hat, konnte es bei Bedarf A ersetzen.

Wenn die Anwendung neu gestartet wurde (über A), geprüft A, wenn B ein paar Dateien heruntergeladen und ersetzt sie, bevor es B. begann

+0

Kürzlich bin ich auf die Tatsache gestoßen, dass eine laufende ausführbare Datei nicht überschrieben werden kann, aber umbenannt werden kann. Ich habe das selbst in einer Test-App ausprobiert und werde diese Technik verwenden, um meine eigene Komponente zur Selbstaktualisierung von Anwendungen zu entwickeln. – jpierson

+1

Werfen Sie einen Blick in Schattenkopie (http://msdn.microsoft.com/en-us/library/ms404279.aspx). Wir verwenden es, um Clients auf einem Terminalserver die Clientsoftware zu aktualisieren, während andere Benutzer die Anwendung gleichzeitig auf demselben Computer ausführen. – sloth

0

ich meistens mit Stefan's Answer Ausnahme einig, dass es nicht, wenn Sie richtig mögen zusammenarbeiten, um Arbeiten Sie mit UAC unter Windows Vista oder Windows 7 und Ihre App wird ordnungsgemäß im Ordner "Programme" installiert oder erfordert die Installation anderer Abhängigkeiten, die erhöhte Berechtigungen benötigen.

In diesem Fall führen Sie entweder eine MSI-basierte Installation/Patch durch oder installieren einen Windows-Dienst, der mit der erforderlichen Sicherheit ausgeführt wird, um Dateien im Ordner "Programme" zu überschreiben. Die andere Option, wenn Ihre App interaktiv ist, ist zu tun, wie Igor Brejc vorschlägt, und erstellt einen neuen Prozess, der die Aktualisierung durchführt, die Ihrer App die Möglichkeit gibt, während des Updates die Berechtigungen zu erhöhen. Die Verwendung der oben genannten Patch- oder Windows-Dienstoption würde jedoch unabhängig vom Szenario (interaktiv/nicht-interaktiv) eine bessere Benutzererfahrung bieten.

Verwandte Themen