在我的應用程序中附帶一個卸載程序。 一切工作正常,但我無法找到任何方法刪除uninstaller.exe文件,當它完成。刪除當前加載的程序集
我試圖將當前程序集exe複製到臨時目錄,但原始文件的文件句柄仍然被鎖定。
任何想法?
在我的應用程序中附帶一個卸載程序。 一切工作正常,但我無法找到任何方法刪除uninstaller.exe文件,當它完成。刪除當前加載的程序集
我試圖將當前程序集exe複製到臨時目錄,但原始文件的文件句柄仍然被鎖定。
任何想法?
你將需要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
}
如果您發佈了一些代碼,說明如何正確複製uninstaller.exe並將執行更改爲特定的可執行文件,那將會很有趣。
我認爲unloading the application domain將釋放文件句柄。
沒有什麼花哨,簡單地將文件複製到一個臨時目錄(使用File.Copy) 它使用Prcess.Start和處置原 開始什麼可能會幫助我是一種啓動沒有Process類的exe的方法(更多到PInvoke方向) – Nissim 2009-07-01 13:31:50
您可能能夠通過使用shadow copying of assemblies達到你想要什麼,但我還沒有嘗試過,對於這種情況。
您可以使用「CMD」與延遲:
internal static void ExitAndDelete()
{
var f = Application.ExecutablePath;
Process.Start(new ProcessStartInfo("CMD.exe", "/C timeout 2&del \"" + f + "\"") { WindowStyle = ProcessWindowStyle.Hidden });
}
謝謝!偉大的作品...永遠不會想到這個我自己 但是有反正馬上刪除它?我知道有卸載程序正是這樣做! – Nissim 2009-07-01 13:06:32