在我的应用程序中带有一个卸载程序。一切正常,除了完成后我找不到删除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 并将执行更改为该特定可执行文件的代码,那将会很有趣。
我认为卸载应用程序域将释放文件句柄。
您可能能够通过使用程序集的卷影复制来实现您想要的,但我还没有在这种情况下尝试过。
您可以延迟使用“cmd”:
internal static void ExitAndDelete()
{
var f = Application.ExecutablePath;
Process.Start(new ProcessStartInfo("CMD.exe", "/C timeout 2&del \"" + f + "\"") { WindowStyle = ProcessWindowStyle.Hidden });
}