Es gibt einen netten kleinen Trick, den Sie verwenden können, wenn das Betriebssystem niemals eine Sperre für die .dll
s / .exe
und für .exe
ausführen soll.
Nehmen wir an, unser Verzeichnis sieht so aus:
%Vor%Als ein grundlegendes Beispiel könnten wir dies tun:
%Vor% Wir könnten dort auch mehr Logik einfügen, die wir verwenden könnten, um actualProgram.exe
tatsächlich zu ersetzen / zu aktualisieren, obwohl eine Instanz des Prozesses geöffnet wurde. Probieren Sie es aus: Sie können Abhängigkeiten und das "aktuelle" Programm löschen / ändern / ersetzen, wenn es über den "Öffner" geladen wird. Offensichtlich hat dies seine Vorteile, nämlich Updates viel einfacher zu machen.
Aber wie können Sie in Ihrer "actual.exe" sicher sein, dass sie über eine andere ausführbare Datei geladen wurde und wissen, dass sie geladen wurde, ohne dass eine Sperre für .exe
gesetzt wurde? Wenn jemand nur die "actual.exe" laden soll, d. H. Nicht über den "Öffner", möchte ich sicherstellen, dass der Prozess sofort beendet wird.
Hinweise?
actualProgram.exe
, damit dieser weiß, dass er vom Launcher gestartet wurde. (Auch in einem Kommentar zum OP von oleksii vorgeschlagen) AssemblyResolve
-Ereignis verwenden, indem Sie die Datei von der Festplatte in ein Bytearray laden und die Assembly.Load(byte[], byte[])
-Überladung verwenden. Hinweis: Solange alle Ihre Assemblys manuell oder durch die Laufzeit geladen werden, bevor Sie sie ändern / verschieben / löschen, sind Sie wahrscheinlich in Ordnung. Auch das Ändern der DLL nach dem Laden wird wahrscheinlich keine Auswirkungen auf den laufenden Prozess haben. Ich sage wahrscheinlich in beiden Fällen, weil es im Allgemeinen eine gute Idee ist, die Bibliotheken zur Laufzeit allein zu lassen, besonders wenn Sie sie nicht manuell laden.
Siehe auch:
Wie wäre es mit dem Senden einer benutzerdefinierten Nachricht an die Anwendung, nachdem sie gestartet wurde? Der Code für start lautet etwa so:
%Vor%und die Anwendung, die Sie ausführen verwenden, benötigen einen kurzen benutzerdefinierten Windows-Meldungshandler, um auf das "Stay-Alive" -Signal zu achten.
%Vor%Wenn Sie sich nicht auf das Timing von Windows-Nachrichten verlassen möchten, können Sie Ihr Zielprogramm so einstellen, dass es gestartet wird, aber erst dann wirklich etwas tun, wenn es die benutzerdefinierte Nachricht empfängt.