1

在我的应用程序中带有一个卸载程序。一切正常,除了完成后我找不到删除uninstaller.exe文件的方法。

我试图将当前程序集 exe 复制到临时目录中,但原始文件的文件句柄仍被锁定。

有任何想法吗?

4

4 回答 4

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
}
于 2009-07-01T12:30:49.540 回答
1

如果您发布一些有关如何准确复制uninstaller.exe 并将执行更改为该特定可执行文件的代码,那将会很有趣。
我认为卸载应用程序域将释放文件句柄。

于 2009-07-01T12:26:53.590 回答
1

您可能能够通过使用程序集的卷影复制来实现您想要的,但我还没有在这种情况下尝试过。

于 2009-07-01T13:10:33.687 回答
0

您可以延迟使用“cmd”:

    internal static void ExitAndDelete()
    {
        var f = Application.ExecutablePath;
        Process.Start(new ProcessStartInfo("CMD.exe", "/C timeout 2&del \"" + f + "\"") { WindowStyle = ProcessWindowStyle.Hidden });
    }
于 2016-08-13T16:32:52.270 回答