删除当前加载的程序集

时间:2009-07-01 12:20:34

标签: c# file-io filehandle

在我的应用程序中附带一个卸载程序。 一切都运行正常,除了我完全没有办法删除uninstaller.exe文件。

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

有什么想法吗?

4 个答案:

答案 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 });
    }