代码之家  ›  专栏  ›  技术社区  ›  Nissim

删除当前加载的程序集

  •  1
  • Nissim  · 技术社区  · 17 年前

    一切正常,只是当卸载完成时,我找不到删除卸载.exe文件的方法。

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

    有什么想法吗?

    4 回复  |  直到 12 年前
        1
  •  7
  •   Hemant    17 年前

    您需要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
    }
    
        2
  •  1
  •   fretje    17 年前


    我认为 unloading the application domain 将释放文件句柄。

        3
  •  1
  •   Lucero    17 年前

    通过使用 shadow copying of assemblies ,但我还没有尝试过这种情况。

        4
  •  0
  •   mrbm    10 年前

    您可以使用带延迟的“cmd”:

        internal static void ExitAndDelete()
        {
            var f = Application.ExecutablePath;
            Process.Start(new ProcessStartInfo("CMD.exe", "/C timeout 2&del \"" + f + "\"") { WindowStyle = ProcessWindowStyle.Hidden });
        }
    
    推荐文章