【问题标题】:Delete currently loaded assembly删除当前加载的程序集
【发布时间】:2009-07-01 12:20:34
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

    标签: c# file-io filehandle


    【解决方案1】:

    您需要 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
    }
    

    【讨论】:

    • 谢谢!效果很好......我自己永远不会想到这个,但有没有办法立即删除它?我知道有些卸载程序可以做到这一点!
    • 也许卸载程序是由其他引擎执行的,而不是引擎本身。例如,如果你有一个 msi,它是由 windows 安装程序执行的,它实际上是一个不同的应用程序,所以它可以删除 msi。但在你的情况下,它是引擎本身。删除锁定的文件(任何文件,而不仅仅是 exe)可能是文件系统的东西......
    【解决方案2】:

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

    【讨论】:

    • 没什么花哨的,只需将文件复制到临时目录(使用 File.Copy)使用 Prcess.Start 启动它并处理原始文件可能对我有帮助的是一种在没有 Process 类的情况下启动 exe 的方法(更多关于 PInvoke 方向)
    【解决方案3】:

    您也许可以使用shadow copying of assemblies 来实现您想要的,但我还没有在这种情况下尝试过。

    【讨论】:

      【解决方案4】:

      你可以延迟使用“cmd”:

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

      【讨论】:

        猜你喜欢
        • 2015-10-06
        • 1970-01-01
        • 2010-09-27
        • 2013-11-12
        • 2011-09-27
        • 1970-01-01
        • 1970-01-01
        • 2012-10-20
        • 2012-06-04
        相关资源
        最近更新 更多