winforms - 将 UserControl 添加到表单时 VS2013 挂起

标签 winforms visual-studio-2013 user-controls c++-cli freeze

解释这一点的最好方法是描述我如何随意重现该问题。

  1. 在设计器中打开现有的 Windows 窗体文件
  2. 打开工具箱并单击自定义用户控件
  3. 在设计器中单击表单进行添加
  4. VS2013 挂起(不会崩溃);杀死 VS2013 并重新启动它
  5. 再次打开表单
  6. 重置工具箱并重新添加包含我的自定义用户控件的 DLL
  7. 尝试将控件添加到表单中——它工作得很好!
  8. 关闭 VS2013
  9. 打开VS2013
  10. 重复将自定义 UserControl 添加到表单的任务
  11. VS2013 挂起

所以,这个故事的寓意是,关闭并重新打开 VS2013 后,任何添加自定义用户控件的尝试都会挂起 VS2013,唯一的补救方法是重置工具箱并重新添加用户控件 DLL;该补救措施仅持续到 VS2013 退出并再次启动为止。

很多谷歌搜索都给出了关于使用第二个 VS 实例附加到第一个实例并查看引发的异常的建议,但没有引发任何异常;应用程序只是挂起。

我发现最能描述我的问题的一件事与我没有使用的某些远程桌面软件有关。

有人有什么想法吗?我还没有尝试重新安装 Visual Studio,因为这会导致相当长的停机时间。最后的手段之类的事情(我读过一些东西表明它不会有帮助)。

编辑:显然有时重置/重新添加并没有让它变得更好。

编辑:我应该提到的一些其他事情:

  • 当我尝试使用第二个 VS 实例时,没有 devenv.exe 调试,所以我最终选择WDExpress.exe
  • 特定的用户控件已经成熟,最近没有改变,并且在项目中的许多表单上使用
  • 此问题在添加控件的新实例时出现;仅通过尝试为已包含设计器的表单启动设计器不会发生挂起。
  • 最新的 VS2013 更新可能已经修复了这个问题;现在还没有发生,我不想在完成工作之前再次尝试重现它而激怒众神。

最佳答案

将 Visual Studio 与自定义 UserControl 挂起非常很容易做到。只需一个简单的示例即可,双击设计图面并写入:

    private void UserControl1_Load(object sender, EventArgs e) {
        while (true) { }
    }

编译并将添加的控件从工具箱顶部拖放到窗体上。演出结束。

您可能没有花足够的时间使用您已经找到的指南,否则我们将需要查看堆栈跟踪。连接调试器非常简单,如果代码抛出异常,您就领先了。但事实并非如此,这样的悬挂不会抛出。练习调试这个特殊的简单挂起以了解如何做到这一点:

  • 再次启动 VS,“调试”>“附加到进程”> 选择 devenv.exe
  • 重要提示:单击进程列表上方的“选择”按钮。您需要选择“调试这些代码类型”单选按钮并勾选“托管(v4.5、v4.0)”以及“ native ”。现在点击“附加”。
  • 给它一些时间来加载符号文件,这需要相当长的时间,特别是如果以前从未这样做过。
  • 使用“调试”>“全部中断”。
  • 如果您幸运,那么它现在会停止在导致挂起的确切语句上。在这种情况下很可能。然而,这不能得到保证,它也可能会在 devenv.exe 内运行的众多线程之一上中断,而该线程恰好在调试器中断时处于事件状态。
  • 在这种情况下,您需要使用“调试”>“窗口”>“线程”来选择运行 UserControl 代码的线程。应该是标记为“主线程”的那个。双击它。
  • 如果编辑器没有切换到发生挂起的源代码文件,则使用“调试”>“窗口”>“调用堆栈”来深入了解挂起是如何发生的。如果您需要更多帮助,请使用该跟踪更新问题。

一般来说,UserControl 中可能导致挂起的代码的主要候选对象是其构造函数、Load 事件和 Paint 事件。使用DesignMode property绕过危险代码,这些代码在设计器而不是常规进程中运行时不太可能正常工作。请注意先有鸡还是先有蛋的问题,如果您的 UserControl 中有一个简单的错误,那么它很容易在设计时首先出现,然后您才有机会像平常一样对其进行调试。可能需要禁用代码块才能解决该错误,请使用 DesignMode 来实现这一目标。

还有一个细节,它被标记为 [c++-cli]。您必须选择旧的调试引擎来调试 C++/CLI 代码。工具 > 选项 > 调试 > 常规 > 勾选“使用托管兼容模式”复选框。

关于winforms - 将 UserControl 添加到表单时 VS2013 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33571779/

相关文章:

c# - 确定按钮上的用户帐户控制

.net - 如何将 CheckBox 绑定(bind)到可为 null 的 bool 类型 DbColumn?

c# - 如何停止多次运行的进程

visual-studio-2013 - 有没有办法找到不属于任何测试套件的测试用例?

wpf - 在WPF用户控件库中隐藏控件

c# - WPF 有 e.CloseReason 吗?

visual-studio-2013 - VS 2013 SqlBuildTask 04018 错误

asp.net-mvc - Visual Studio 2013 SP2 中未生成特定于文化的资源文件

c# - 按顺序循环父控件

c# - 在一页中使用同一个用户控件两次会出现名称冲突问题