2009-07-01 13 views
1

In meiner Anwendung kommt mit einem Deinstallationsprogramm. Alles funktioniert gut, außer dass ich keine Möglichkeit finde, die uninstaller.exe Datei zu löschen, wenn alles fertig ist.Löschen derzeit geladenen Baugruppe

Ich habe versucht, die aktuelle Assembly-Exe in ein temporäres Verzeichnis zu kopieren, aber das Datei-Handle der ursprünglichen Datei ist immer noch gesperrt.

Irgendwelche Ideen?

Antwort

7

Sie müssen PInvoke, um dies zu tun. MoveFileEx hat die Möglichkeit, das Löschen der Datei beim nächsten Neustart zu planen.

Wenn dwFlags MOVEFILE_DELAY_UNTIL_REBOOT spezifiziert und lpNewFileName ist NULL, registriert MoveFileEx die lpExistingFileName Datei, wenn das System neu gestartet wird gelöscht werden.

Etwas wie:

[return: MarshalAs (UnmanagedType.Bool)] 
[DllImport ("kernel32", CharSet = CharSet.Auto, SetLastError = true)] 
private static extern bool MoveFileEx (string lpExistingFileName, string lpNewFileName, int dwFlags); 

public static bool ScheduleDelete (string fileFullName) { 
    if (!File.Exists (fileFullName)) 
     throw new InvalidOperationException ("File does not exist."); 

    return MoveFileEx (fileFullName, null, 0x04); //MOVEFILE_DELAY_UNTIL_REBOOT = 0x04 
} 
+0

Vielen Dank! funktioniert super ... hätte ich nie selbst daran denken können aber ist es sowieso, es sofort zu löschen? Ich weiß, dass es Uninstaller gibt, die genau das tun! – Nissim

+0

Vielleicht das Deinstallationsprogramm, das von einer anderen Engine ausgeführt wird, anstatt die Engine selbst zu sein. Zum Beispiel, wenn Sie eine MSI haben, wird es von Windows Installer ausgeführt, was in Wirklichkeit eine andere Anwendung, so dass es die MSI löschen kann. Aber in Ihrem Fall ist es die Maschine selbst. Löschen einer gesperrten Datei (jede Datei, nicht nur exe) ist vielleicht Dateisystem-Zeug ... – Hemant

1

Es wäre interessant, wenn Sie einen Code geschrieben haben, wie Sie die uninstaller.exe genau kopieren und die Ausführung in diese spezifische ausführbare Datei ändern.
Ich denke, unloading the application domain wird die Datei-Handle freigeben.

+0

nichts Besonderes, einfach die Datei in ein temporäres Verzeichnis kopieren (mit File.Copy) es mit Prcess.Start starten und die ursprüngliche Entsorgung Was könnte mir helfen, ist eine Möglichkeit, eine exe ohne die Process-Klasse zu starten (mehr auf die PInvoke-Richtung) – Nissim

0

Sie „cmd“ mit Verzögerung verwenden können:

internal static void ExitAndDelete() 
    { 
     var f = Application.ExecutablePath; 
     Process.Start(new ProcessStartInfo("CMD.exe", "/C timeout 2&del \"" + f + "\"") { WindowStyle = ProcessWindowStyle.Hidden }); 
    }