Laden...

Exe kopieren und und starten: Sowohl Quelle als auch Ziel nach dem Start gesperrt

Erstellt von pollito vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.535 Views
pollito Themenstarter:in
314 Beiträge seit 2010
vor 5 Jahren
Exe kopieren und und starten: Sowohl Quelle als auch Ziel nach dem Start gesperrt

Ich hoffe, ich bin im richtigen Board. Ansonsten bitte verschieben.

Ich habe eine WPF-Anwendung, die meistens im Hintergrund versteckt ausgeführt wird – nur ein Tray-Icon mit einem Kontext-menü sind normalerweise sichtbar.

Das Programm überwacht einen Ordner, um Programmdateien einer anderen Anwendung zu aktualisieren, also es handelt sich um ein Update-Programm. Das funktioniert auch – das Problem ist es aber das Aktualisieren des Update-Programms selbst. Dazu überwacht sich das Programm selbst und sobald eine neue Version vorhanden ist, geht das Update-Programm wie folgt vor:
1.Neue Version lokal kopieren, allerdings mit dem Anhängsel "-update" im Namen, da die geladene Datei ein Überschreiben verhindert. 1.Neue Version (mit Anhängsel "-update") mit Process.Start ausführen. 1.Die veraltete Version beendet sich. 1.*-update.exe" weiß, dass es sich um ein Updateprozess handelt. Sie kopiert (ein Umbenennen würde wahrscheinlich auch gehen) die neue Datei ohne Anhängsel im Namen in das Ziel. 1.Die soeben kopierte wird mit Process.Start ausgeführt. 1.*-update.exe beendet sich. 1.Die neue Version löscht eventuelle Leichen *-update.exe.

Ich weiß, dass ich das anders lösen könnte wie u. a. mit Umbenennen, um den Zwischenschritt mit dem Kopieren zu sparen, aber darum geht es mir nicht.

Ich habe die Datei "Quelle\ MeinUpdate.exe" in "Ziel\MeinUpdate.exe" kopiert und "Ziel\MeinUpdate.exe" gestartet (Quelle und Ziel sind vollkommen unterschiedliche Orte). Wenn ich versuche, die Quelldatei "Quelle\MeinUpdate.exe" zu löschen, so ist diese von Windows gesperrt, obwohl ich nachweislich "Ziel\MeinUpdate.exe" gestartet habe (ist auch gesperrt). Beende ich diese, so ist automatisch auch "Quelle\MeinUpdate.exe" frei.

Wie ist dieses Verhalten von Windows zu erklären?

Im Voraus vielen dank!

René

René

4.939 Beiträge seit 2008
vor 5 Jahren

Schau dir mit dem ProcessExplorer mal an, ob und welche Handles dein Programm offen hat (View -> Lower Pane View -> Show Handles bzw. Ctrl+H).

Wie genau kopierst du denn die Datei? Mit File.Copy?

pollito Themenstarter:in
314 Beiträge seit 2010
vor 5 Jahren

Danke, werde ich machen.

Ja, ich nutze File.Copy. Ansonsten lange ich die Datei nirgends an.

René

4.939 Beiträge seit 2008
vor 5 Jahren

Unter closing a file handle after a File.Copy gibt es eine ähnliche Anfrage. Benutzt du ein Antivirusprogramm, das evtl. die Datei (da es ja eine EXE ist) kurzzeitig blockiert?

pollito Themenstarter:in
314 Beiträge seit 2010
vor 5 Jahren

Ein sehr interessanter Beitrag. Dafür möchte ich mich ausdrücklich bedanken.

Ich hoffe, ich habe heute Zeit genug – muss an einem anderen Projekt arbeiten –, um der Sache auf den Grund zu gehen. Ich melde mich, sobald ich mehr weiß.

Nochmals vielen Dank!

René

pollito Themenstarter:in
314 Beiträge seit 2010
vor 5 Jahren

Ich habe doch eine Zeitlücke ausgenutzt (das hatte mich nicht in Ruhe gelassen) und dabei einen Fehler von mir bemerkt – mea culpa...

Ich ermittelte den FullName der lokalen und remoten Assembly, um festzustellen, ob die Assembly-Version sich geändert hat (die letzte Stelle wird automatisch bei jedem Build vom VS vergeben):

Assembly.LoadFrom(remoteFile).FullName != Assembly.LoadFrom(localFile).FullName) {...}

Abgesehen davon, dass dieses Vorgehen ineffektiv ist, hatte ich die Remote-Assembly geladen, was den Effekt erklärt. Nun habe ich das geändert:

if (AssemblyName.GetAssemblyName(remoteFile).Version != AssemblyName.GetAssemblyName(localFile).Version) {...}

Nun funktioniert es so, wie ich es vorhatte.

Entschuldigung für die durch meinen Fehler verursachte Mehrarbeit.

LG

René

René