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

标签 c# debugging visual-studio-2013 visual-studio-2015

我在 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.

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

Handles opened

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

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

这发生在 2013 Ultimate 和 2015 Ultimate 中。

谢谢。

最佳答案

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

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

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

  2. 在同一个窗口中,在您的项目下输入平台并重复步骤 1。删除除 AnyCPU 之外的所有条目。

  3. 关闭配置管理器。

  4. 转到“构建”菜单并单击“清理解决方案”。

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

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

  7. 最大化 Visual Studio,进入配置管理器,重建您的平台目标 (x86/x64),从经过验证的工作环境复制设置:“任何 CPU”。

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

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

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

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

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

如果它仍然发生,如果它发生在“任何 CPU”上,您很可能需要重新访问您的代码。这可能是一个糟糕的流/未关闭流问题,一个卡在系统中的糟糕的 COM 调用等。每当我尝试使用非托管代码或系统进程时,我都会尝试处理应用程序挂起和 StackOverflows。这可能会如前所述发生。

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 StackOverflow Exception!\n\n" +
              "Exception : " + e.Exception.Message + "\n\n" + "Stack : " + e.Exception.StackTrace,
              "Ridonculous StackOverflow Exception Occurred", MessageBoxButtons.OK, MessageBoxIcon.Stop);
    }
    finally
    {
        Application.Exit();
    }
}

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

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

How To Repair

How To Repair 2

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

关于c# - Visual Studio 在停止调试器后保持句柄打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28190732/

相关文章:

c# - 在 PHP 中将字节数组转换为字符串

java - React native ANDROID 构建失败并在 BasePackageList.java 中出现错误。可变参数不匹配; ApplicationPackage 无法转换为 Package

c - C 猜谜游戏,使用 while 循环和 if 语句调试

c# - 如何将 CheckedListBox 项目设置为默认选中

c# - 从匹配两个单独的 List<T> 中获取 List<T>

WrapPanel 中的 C# WPF 控件

javascript - 网络浏览器未在 Windows Phone 8 上加载页面内容

c - 无法解决 Valgrind 给出的未初始化值错误

visual-studio - 尝试将文件与服务器版本进行比较时出现问题

c++ - 错误 "this declaration has no storage class or type specifier"