Nein, das ist nicht akzeptabel. Mach das nicht. Dies ist kein gültiger Bereitstellungsmechanismus. Dies sollte dein oder sein erster Hinweis gewesen sein:
Es wird manchmal eine Ausnahme ausgelöst, dass die Datei in seinem Programm verwendet wird, aber wenn er versucht, sie in einer Schleife umzubenennen, wird es schließlich gelingen.
Und es wird sowieso nicht funktionieren. Seine Theorie ist völlig falsch:
Mit diesem Wissen will er eine laufende exe umbenennen und über eine neue Version der besagten exe kopieren, so dass jeder, der seine im Speicher befindliche Kopie von foo.exe ausführt, in Ordnung ist und jeder, der eine Verknüpfung auf foo.exe öffnet, bekommt neue Kopie mit Updates angewendet.
Insbesondere wird die Kopie im Speicher nicht automatisch durch die neue ausführbare Datei ersetzt, nur weil sie denselben Namen hat. Der Grund, dass Sie die ausführbare Datei an erster Stelle umbenennen dürfen, liegt daran, dass das Betriebssystem den Dateinamen nicht verwendet, um die Anwendung zu finden. Die ursprüngliche ausführbare Datei wird weiterhin geladen und bleibt geladen, bis Sie sie explizit entladen und die neue, geänderte ausführbare Datei laden.
Beachten Sie, dass selbst moderne Webbrowser wie Chrome und Firefox mit ihrer superschicken Automatik, im Hintergrund, niemand merkt, dass sie existieren, updaters noch immer die Anwendung schließen und neu starten müssen Übernehmen Sie die Updates.
Mach dir keine Sorgen darüber, den Boten hier zu erschießen. Es ist wahrscheinlicher, dass Ihre Kunden und Ihre technische Supportabteilung Sie zuerst erschießen.
Siehe Nummer 1.
In unserer Organisation haben wir das Problem von Updates gelöst, indem wir zwei Release-Ordner mit EXE_A und EXE_B haben. Wir haben auch einen Release-Ordner namens EXE, der nur Links hat, von denen ALL entweder auf EXE_A oder EXE_B verweist, von denen aus der Benutzer die Anwendungen ausführt.
Wenn wir eine neue Version des Programms veröffentlichen, veröffentlichen wir sie in dem Ordner, auf den in den Links nicht verwiesen wird, und aktualisieren dann die Verknüpfungen (EXE). Auf diese Weise kommen Sie nicht in Ausnahmen, dass Benutzer die Anwendung / Assemblys halten. Auch wenn ein Benutzer die aktualisierte Version ausführen möchte, muss er nur den Link im EXE-Ordner schließen / erneut ausführen.
Ein Flugzeugmechaniker und ein Chirurg treffen sich in einer Bar. Der Mechaniker sagt: "Weißt du, wir haben im Grunde den gleichen Job. Wir nehmen kaputte Sachen raus und legen neue, bessere Teile rein." Der Chirurg sagt "Ja, aber Sie müssen das Flugzeug nicht fliegen lassen, während Sie die Reparaturen machen!"
Der Versuch, eine Anwendung zu aktualisieren, indem Dateien verschoben werden, während die Anwendung ausgeführt wird, ist ungefähr so gefährlich wie der Versuch, ein Flugzeug im Flug zu reparieren. Möglich? Sicher. Stark erhöhtes Risiko für Catestrophic Crash? Ja.
Wenn es sich bei der Anwendung, die Sie aktualisieren, um eine verwaltete Anwendung handelt, sollten Sie verwenden ClickOnce-Bereitstellung . Wenn die Anwendung das nächste Mal ausgeführt wird und eine neue Version verfügbar ist, wird sie automatisch kopiert und installiert. Das ist viel sicherer und angenehmer als zu versuchen, sich mit einer Anwendung zu beschäftigen, während sie noch läuft.
Wir versuchen, Updates auf mehrere Server gleichzeitig zu übertragen, und mein Manager hat festgestellt, dass es möglich ist, laufende .exe-Dateien umzubenennen. Mit diesem Wissen will er eine laufende exe umbenennen und über eine neue Version der exe kopieren, so dass jeder, der seine Kopie im Speicher von foo.exe ausführt, in Ordnung ist und jeder, der eine Verknüpfung auf foo.exe öffnet, eine neue Kopie mit bekommt Aktualisierungen angewendet.
Ich denke, ich muss klarstellen, Er erwartet nicht, dass die alte Kopie magisch aktualisiert wird, er erwartet nur, dass sie die alte Kopie weiter laufen lassen, bis sie die exe wieder öffnen, in welchem Fall sie dann die neue öffnen wird hat den Namen des alten.
Es gibt manchmal eine Ausnahme, dass die Datei in seinem Programm verwendet wird, aber wenn er versucht, es in einer Schleife umzubenennen, wird es schließlich erfolgreich sein. Auf meiner Maschine muss ich es noch in einer Schleife arbeiten lassen.
Meine erste und wichtigste Frage lautet: Ist es jemals akzeptabel, dies zu tun? Sollte das Umbenennen einer laufenden ausführbaren Datei jemals ein gültiges Szenario sein?
Zweitens, wenn es ein gültiges Szenario ist, wie könnte man das dann zuverlässig tun? Unsere aktuellen Gedanken sind es, einige Male mit File.Move (C #) zu versuchen, eine Umbenennung vorzunehmen und wenn es nicht funktioniert, dann schreibe in ein Fehlerprotokoll, damit es manuell behandelt werden kann.
Wenn Sie Windows Vista / Server2k8 oder neuer verwenden, können Sie mit %code% einen symbolischen Link zu dem Ordner erstellen, der Ihre Anwendung enthält, und die Anwendung aus dem "symblic linked folder" starten und dann beim Update einen neuen Ordner erstellen , z.B "AppV2" und ändern Sie SymLink in diesen Ordner. Wenn der Benutzer das Programm das nächste Mal neu startet, startet er es aus dem neuen Ordner, ohne es zu bemerken.
Das Umbenennen offener Dateien ist IMMER eine schlechte Wahl!
Aber im Allgemeinen würde ich mir sowieso eine bessere Bereitstellungsstrategie überlegen, denn wenn Sie solche "Hacks" verwenden müssen, ist das immer eine chaotische Situation. Ich kenne Ihre Anwendung nicht, aber vielleicht wäre ClickOnce ein Startpunkt, weil Sie sie so konfigurieren können, dass sie bei jedem Start nach Updates sucht ...