2008-09-29 3 views
23

Aus technischen Gründen kann ich ClickOnce nicht verwenden, um meine .NET-Anwendung und ihre Assemblys automatisch zu aktualisieren. Was ist der beste Weg zur automatischen Aktualisierung in .NET?Was ist der beste Weg für eine .NET Winforms-Anwendung, sich ohne ClickOnce zu aktualisieren?

+0

Welche "technischen Gründe" halten Sie davon ab, ClickOnce zu verwenden, die Einschränkungen bei der Antwort darstellen, nach der Sie suchen? – lotsoffreetime

+1

Der beste technische Grund imho ist keine Installation erlaubt, die GAC. Es ist eine meiner Hauptbeschwerden über ClickOnce – MagicKat

+0

Huh? Welcher Teil von ClickOnce wird auf dem GAC installiert? –

Antwort

9

Ich denke, die Updater Application Block war so etwas wie ein Vorläufer von ClickOnce. Vielleicht lohnt es sich zu untersuchen. Der Blick auf seinen Quellcode könnte genug sein, um einige Ideen zu entfachen.

+0

Vielen Dank! Daran erinnerte ich mich, vor ein paar Jahren gelesen zu haben. – MusiGenesis

+4

Und jetzt erinnere ich mich, warum ich es nie benutzt habe. Meine Güte. – MusiGenesis

+0

lol! Ja, die Anwendungsblöcke sind etwas entmutigend. Ich habe sie auch nie benutzt. –

1

Schreiben Sie Ihre eigenen.

Ich habe gehört, dass sie beim ersten Mal etwas schwierig zu schreiben sind, aber danach wird es einfach.

Da ich noch keins geschrieben habe (obwohl es auf meiner Liste steht), kann ich Ihnen einige der Dinge nennen, an die ich gedacht habe. Pflegen Sie genaue DLL-Versionen, da dies für die Selbstaktualisierung wichtig ist. Und stellen Sie sicher, dass der Updater sich selbst aktualisieren kann.

+0

Das macht wirklich Spaß! Ich habe es getan, indem ich die Anwendung das Aktualisierungsprogramm aktualisieren ließ. –

+0

Das Rollup meines eigenen Updaters hat mehrere Monate in meiner Firma gedauert, aber jetzt haben wir einen, den wir in- und auswendig kennen und nach Belieben debuggen können. Es war es wirklich wert. – Dinah

1

In Ihrer Datei Program.cs etwas tun, wie folgt aus:

static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Update(); 
     Application.Run(new Form1()); 
    } 

    private static void Update() 
    { 
     string mainFolder; 
     string updateFolder; 
     string backupFolder; 

     foreach (string file in 
      System.IO.Directory.GetFiles(updateFolder)) 
     { 
      string newFile = file.Replace(
       updateFolder, mainFolder); 

      if (System.IO.File.Exists(newFile)) 
      { 
       System.IO.File.Replace(file, newFile, backupFolder); 
      } 
      else 
      { 
       System.IO.File.Move(file, newFile); 
      } 
     } 
    } 

Zusätzlich kann es Verzeichnisstruktur zu holen, wenn nötig gemacht rekursive werden. Auf diese Weise können Sie jede DLL in Ihrem Projekt aktualisieren. alles außerhalb der Hauptdatei .exe. An anderer Stelle innerhalb Ihrer Anwendung können Sie die Dateien von Ihrem Server (oder wo auch immer), die aktualisiert werden müssen, holen, dann in den updateFolder stellen und die Anwendung neu starten.

+0

Danke. Hauptsächlich richtete ich die Frage auf die Selbstaktualisierung (d. H. Das Aktualisieren der Haupt-EXE aus der Haupt-EXE). – MusiGenesis

+0

Sie können die exe nicht von der exe selbst aktualisieren, so dass Sie immer noch einen externen Prozess haben müssen. –

+0

Sicher kannst du. Sie haben Ihre EXE selbst umbenennen, einen "Löschen nach Neustart" -Befehl in die alte Version einreihen und in die neue Version kopieren. Die alte App kann dann die neue App ausführen und unmittelbar danach beenden und möglicherweise einen/upgrade-Parameter übergeben, sodass die neue App weiß, dass möglicherweise alte gespeicherte Datenstrukturen aktualisiert werden müssen. – Sander

2

Vor etwa 3-4 Jahren habe ich ein Beispiel außerhalb der App veröffentlicht, wenn ein Update erkannt wird, ruft die App den Updater auf und fährt herunter, dann werden die Updates durchgeführt und die App neu gestartet.

Ich habe das Beispiel auf der alten GotDotNet Seite veröffentlicht ... Ich muss es versuchen und finden.

Es funktionierte perfekt und dauerte etwa 1-2 Stunden zu schreiben.

+0

Wie aktualisierst du den Updater? – MusiGenesis

+1

Ich habe eine Methode in der App, die, wenn ein Update für den Updater gefunden wird, das Update anwenden wird.Grundsätzlich aktualisiert jeder den anderen, es klingt komplex und schwer zu verwalten, ist aber eigentlich sehr einfach. Ich denke zumindest, dass ich den Code irgendwo zuhause habe. –

+0

Können Sie es veröffentlichen? –

2

Indigo Rose hat ein Produkt namens TrueUpdate, das auch dies für Sie tut. Ich habe sie in der Vergangenheit sowohl von verwalteten als auch von nicht verwalteten Apps verwendet. Es ist im Grunde eine Datei, die Sie auf Ihren Server stellen (http, ftp, was auch immer Sie mögen). Dann rufen Sie eine clientseitige EXE auf, um nach Updates zu suchen. Die Update-Datei wird abgerufen und verfügt über Logik, um festzustellen, welche Version auf dem Client ist (Ihre Wahl, DLL-Erkennung, Registrierungsschlüssel liest usw.). Dann wird es den entsprechenden Updater finden und die Datei zur Ausführung herunterladen. Es funktioniert auch gut mit Proxies.

Das einzige, was sie nicht tun, ist tatsächlich die Patches für Sie zu bauen. Sie müssen das manuell oder mit einem anderen Produkt tun, das sie haben. Es ist eine kommuzielle Lösung und funktioniert ganz gut, wenn Sie es brauchen.

+0

Sieht cool aus, danke, aber keine Windows Mobile-Unterstützung. Diese App ist etwas ungewöhnlich, da sie sowohl in Windows Mobile als auch auf normalen PC Windows läuft. – MusiGenesis

1

In einem Projekt vor langer Zeit, mit .NET Compact Framework 1.0, schrieb ich eine Auto-Update-Anwendung. Wir verwendeten SqlCEs CAB-Bereitstellungsfunktion, um die Dateien auf das Gerät zu übertragen (Sie würden jetzt Sync Framework verwenden), und wir hatten eine separate Exe, die das Entpacken des CAB und das Aktualisieren der Dateien ausführte.

Ein Update würde so gehen: Der Benutzer würde aufgefordert, zu aktualisieren, klicken Sie auf eine Schaltfläche und verlassen Sie die UI-Anwendung. Die Updater-EXE würde übernehmen, die CAB-Datei vom Server holen, die aktuellen DLLs sichern und die CAB-Datei mit Wceload entpacken. Die Benutzeroberfläche würde dann neu gestartet werden, und wenn es fehlschlägt, wird die Aktualisierung zurückgesetzt. Dies ist immer noch ein interessantes Szenario auf kompakten Geräten, aber es gibt jetzt bessere Tools als nur sqlce.

Ich würde sicherlich auf Updater Application Block und Sync Framework zu implementieren, um dies zu implementieren, wenn Clickonce keine Option ist.Aber ich schätze, Sie werden immer noch eine separate ausführbare Datei benötigen, da die dlls, die Sie überschreiben wollen, wahrscheinlich Datei gesperrt sind, während sie von einer exe verwendet werden, wie eine der vorherigen Antworten schon sagt.

+0

Wie erhalten Sie die Updater-Exe, nachdem die Benutzeroberfläche geschlossen wurde? Läuft es immer und fragt, ob ein Update erforderlich ist? Ich habe versucht, den Updater automatisch in einem anderen Prozess zu starten, aber ich kann immer noch nicht die ursprüngliche laufende EXE überschreiben. – MusiGenesis

+0

Ich erinnere mich nicht genau, aber Sie könnten dies mit einem manuellen Reseesevent oder einem Semaphor-ähnlichen Mechanismus tun. Als letzte Aktion löst die ausgehende UI ein systemweites Ereignis aus. Zu der Zeit, als der Updater das CAB heruntergeladen hat, es entpackt hat und versucht, die UI-Exe zu überschreiben, ist sie längst beendet. – stombeur

2

Als Ausgangspunkt für Ihre eigenen, ist es wahrscheinlich lohnt sich Alex Feinman's article on MSDN mit dem Titel "Creating Self-Updating-Anwendungen mit dem .NET Compact Framework".

1

Ich habe meinen eigenen Autoupdater geschrieben, der Autoupdater verwendet eine gemeinsame Konfigurationsdatei für die Anwendung, die URLs enthält, um die neuesten Versionen herunterzuladen/zu überprüfen, ob sie aktualisiert werden muss.

Auf diese Weise führen Sie den Updater aus, der entweder die App aktualisiert oder nicht, und führt dann die Anwendung aus, die im Rahmen des normalen Betriebs nach einem aktualisierten Updater sucht und diesen patcht.

16

Wir haben ein Produkt, das kommerzielle/Open Source ist: wyBuild & wyUpdate. Es hat Patching-Fähigkeit und ist tod einfach zu bedienen.

Edit: Ich werde in die negativen Zahlen gewählt, aber meine Post war nicht nur eklatante Verkäufe. Unser Updater, wyUpdate, ist Open Source, in C# geschrieben und unter der BSD-Lizenz lizenziert.

Ich dachte, es könnte jedem helfen, der versucht, ein Updater von Grund auf mit dem .NET-Framework zu bauen.

Aber, stimmen Sie mich ab, wenn Sie müssen.

+0

Wie ist dies in irgendeiner Weise hilfreich für eine Compact Framework-Bereitstellung? – ctacke

+1

Unser Open-Source-Updater kann bei der Entwicklung eines eigenen Updaters sehr hilfreich sein. Es ist in C# geschrieben und unter der BSD-Lizenz lizenziert. Aber stimm mich ab, wenn du musst. –

Verwandte Themen