2009-07-01 29 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 }); 
    }