Visual Studio在停止调试器后保持句柄处于打开状态

时间:2015-01-28 11:09:56

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

我在MS Visual Stdio中一直收到以下错误:

  

无法复制文件" obj \ Debug [Program] .exe" to" bin \ Debug [Program] .exe"。该进程无法访问文件&bin; \ Debug [Program] .exe'因为它正被另一个进程使用。

在关闭和/或停止调试器后,这会随机发生。该程序已关闭,但VS保留了一些对该程序开放的句柄。

Handles opened

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

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

这发生在2013年Ultimate和2015 Ultimate。

感谢。

3 个答案:

答案 0 :(得分:4)

我将提出一个新的解决方案,永久修复它。我总是这样做,当遇到“调试器”问题时,主要是在迁移到带有旧解决方案的新Visual Studio时,所以你的里程可能会有所不同。

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

  1. 进入“配置管理器”,将“活动解决方案平台:”更改为任意CPU,再次单击向下箭头,然后选择“编辑...”,在此处删除任何自定义条目,即使它只是x86和x64。

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

  3. 关闭Configuration Manager。

  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. 快乐地再次开始工作!

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

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

    现在,如果您只将“任何CPU”作为配置作为问题,那么有三件事可能会导致这种情况。需要刷新,打开流的“任何CPU”设置可以等于打开句柄,或者可能是StackOverflow异常,但尚未溢出。

    如果“Any CPU”出现这种情况并且您没有其他目标解决方案,则可能首先要尝试此操作。添加一个新的平台目标,x86 / x64,从任何CPU复制设置都没问题。这将允许您从Configuration Manager和解决方案中删除任何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

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

答案 1 :(得分:2)

RagingCain有一些出色的解决方案。如果所有其他方法都失败了,则会出现以下情况:

  1. 使用Process Explorer关闭文件的句柄。
  2. 手动删除.exe文件
  3. 之后,它应该重新编译。

答案 2 :(得分:1)

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

为我工作。