Visual Studio 在停止调试器后保持句柄打开

Visual Studio is keeping a handle open after stopping the debugger

我在 MS Visual Stdio 中不断收到以下错误:

Unable to copy file "obj\Debug[Program].exe" to "bin\Debug[Program].exe". The process cannot access the file 'bin\Debug[Program].exe' because it is being used by another process.

这在我关闭 and/or 停止调试器后随机发生。该程序已关闭,但 VS 为该程序保留了几个句柄。

我发现能够重新调试的唯一方法是关闭 Visual Studio,然后重新打开它,这很烦人。

知道为什么会发生这种情况,以及如何在不先关闭调试器的情况下再次 运行 调试器?

这发生在 2013 Ultimate 和 2015 Ultimate 中。

谢谢。

RagingCain 有一些优秀的解决方案。如果一切都失败了,以下将:

  1. 使用 Process Explorer 关闭文件句柄。
  2. 手动删除.exe文件

之后,应该重新编译。

我将提出一个新的解决方案,永久修复它。我一直这样做,当遇到 "Debugger" 问题时,这些问题主要发生在使用旧解决方案迁移到新的 Visual Studio 时,因此您的情况可能会有所不同。

如果切换回 AnyCPU 配置允许您再次调试,那么我相信以下步骤将解决它。

  1. 进入"Configuration Manager",将"Active solution platform:"改为任意CPU,再次点击向下箭头,然后select"Edit...",删除此处的任何自定义条目,即使它只是 x86 和 x64。

  2. 在同一个 Window 中,在您的项目下输入 Platform 并重复步骤 1。删除除 AnyCPU.

    [=67= 之外的所有条目]
  3. 关闭配置管理器。

  4. 转到 "Build" 菜单并单击 "Clean Solution"。

  5. 以管理员身份重新启动 Visual Studio 2015 CTP 5。打开您的解决方案。对一个构建、发布或调试使用 "Any CPU",然后关闭它。只需验证您仍然能够基本上使用 "Any CPU" 目标。

  6. 最小化 Visual Studio,进入您的解决方案并清除所有 Bins/Release 和调试,包括任何 x86/x64 Release/Debug 文件夹,如果它们是仍然存在。

  7. 最大化 Visual Studio,进入配置管理器,重建您的平台目标 (x86/x64) 从已验证的工作中复制设置:"Any CPU".

  8. 重新开始愉快的工作!

错误是由解决方案/项目中保存的不正确、过时或损坏的 "Target Platform" 设置引起的。您可以重复上述步骤,再次删除 Project Solutions 下的 "Any CPU" 设置,因为它也可能在其中缓存了错误的 juju。使用术语 "Any CPU" settings copy settings "Empty Settings" 再次添加它也可能会解决此问题。然后您想要删除所有其他内容,并使用新的 Any CPU 设置将其重新添加为 x86/x64。

决定在我的 blog/site 上制作带有插图的操作方法。

现在,如果您的配置只有 "Any CPU" 有问题,则可能由三件事引起。 "Any CPU" 需要刷新的设置,打开的流可以等于打开的句柄,或者可能是 Whosebug 异常,只是还没有溢出。

如果 "Any CPU" 出现这种情况并且您没有其他目标解决方案,您可能首先想试试这个。添加一个新平台目标 x86/x64,从任何 CPU 复制设置都可以。这将允许您从配置管理器和解决方案中删除 Any CPU。然后您可以添加一个名为 Any CPU 的新解决方案,并将 "empty settings" 作为设置选项。然后删除 x86/x64。这会强制刷新项目中的 Any CPU 配置。尝试构建一两个。

如果它仍然发生,如果它与 "Any CPU" 一起发生,您很可能需要重新访问您的代码。这可能是一个严重的 streaming/unclosed 流问题,一个挂在系统中的糟糕的 COM 调用等。每当我尝试使用非托管代码或系统进程时,我都会尝试处理应用程序挂起和 Whosebugs。这可能会如前所述发生。

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

AppDomain.CurrentDomain.UnhandledException +=
        new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

Application.ThreadException +=
        new ThreadExceptionEventHandler(Application_ThreadException);

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    try
    {
        Exception ex = (Exception)e.ExceptionObject;

        MessageBox.Show("Congratulations, you have broken this program like no other user before you!\n\n" +
              "Exception : " + ex.Message + "\n\n" + "Stack : " + ex.StackTrace,
              "Ridonculous Exception Occurred", MessageBoxButtons.OK, MessageBoxIcon.Stop);
    }
    finally
    {
        Application.Exit();
    }
}

static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
    try
    {
        MessageBox.Show("This is a Whosebug Exception!\n\n" +
              "Exception : " + e.Exception.Message + "\n\n" + "Stack : " + e.Exception.StackTrace,
              "Ridonculous Whosebug Exception Occurred", MessageBoxButtons.OK, MessageBoxIcon.Stop);
    }
    finally
    {
        Application.Exit();
    }
}

来源:http://tech.pro/tutorial/668/csharp-tutorial-dealing-with-unhandled-exceptions

或者:如果您安装了多个 Visual Studio,甚至安装了 Vstudios 预览版,您可能会通过来回切换或 运行 更新。 Visual Studio 的最新版本实际上会通知您 JIT 错误(无论是否存在)并建议您修复 IDE.

其他任何事情都超出了我的知识水平。祝你好运!

项目属性 - 禁用 Visual Studio 托管进程。

对我有用。