在我的应用程序中附带一个卸载程序。 一切都运行正常,除了我完全没有办法删除uninstaller.exe文件。
我尝试将当前程序集exe复制到临时目录中,但原始文件的文件句柄仍然被锁定。
有什么想法吗?
答案 0 :(得分: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
}
答案 1 :(得分:1)
如果您发布了一些代码,说明如何完全复制uninstaller.exe并将执行更改为该特定可执行文件,那将会很有趣。
我认为unloading the application domain将释放文件句柄。
答案 2 :(得分:1)
您可以使用shadow copying of assemblies实现所需目标,但我没有尝试过这种情况。
答案 3 :(得分:0)
您可以使用“cmd”延迟:
internal static void ExitAndDelete()
{
var f = Application.ExecutablePath;
Process.Start(new ProcessStartInfo("CMD.exe", "/C timeout 2&del \"" + f + "\"") { WindowStyle = ProcessWindowStyle.Hidden });
}