2009-07-01 52 views
1

在我的應用程序中附帶一個卸載程序。 一切工作正常,但我無法找到任何方法刪除uninstaller.exe文件,當它完成。刪除當前加載的程序集

我試圖將當前程序集exe複製到臨時目錄,但原始文件的文件句柄仍然被鎖定。

任何想法?

回答

7

你將需要PInvoke來做到這一點。 MoveFileEx能夠在下次重新啓動時安排刪除文件。

如果dwFlags中指定MOVEFILE_DELAY_UNTIL_REBOOT和lpNewFileName是NULL,MoveFileEx註冊lpExistingFileName文件要在系統重新啓動時被刪除。

喜歡的東西:

[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

謝謝!偉大的作品...永遠不會想到這個我自己 但是有反正馬上刪除它?我知道有卸載程序正是這樣做! – Nissim 2009-07-01 13:06:32

1

如果您發佈了一些代碼,說明如何正確複製uninstaller.exe並將執行更改爲特定的可執行文件,那將會很有趣。
我認爲unloading the application domain將釋放文件句柄。

+0

沒有什麼花哨,簡單地將文件複製到一個臨時目錄(使用File.Copy) 它使用Prcess.Start和處置原 開始什麼可能會幫助我是一種啓動沒有Process類的exe的方法(更多到PInvoke方向) – Nissim 2009-07-01 13:31:50

0

您可以使用「CMD」與延遲:

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