【问题标题】:VS2013 Hangs when Adding UserControl to FormVS2013 将 UserControl 添加到窗体时挂起
【发布时间】:2015-11-13 05:20:13
【问题描述】:

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

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

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

很多谷歌搜索已经产生了关于使用第二个 VS 实例附加到第一个并查看抛出的异常的建议,但没有抛出异常;应用程序只是挂起。

我发现与我的问题最密切相关的一件事与我没有使用的一些远程桌面软件有关。

有人有什么想法吗?我没有尝试重新安装 Visual Studio,因为这意味着相当长的停机时间。不得已而为之类的事情(我读过一些内容表明它不会有帮助)。

编辑:显然有时重置/重新添加不会使它变得更好。

编辑:我应该提到的一些额外的事情:

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

【问题讨论】:

  • 呃,我的测试工作赏金评论意味着我测试了解决方案并且它有效......不是回答者必须以某种方式测试我的代码:-)

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


【解决方案1】:

使用自定义 UserControl 挂起 Visual Studio 非常很容易做到。一个简单的例子就够了,双击设计图面然后写:

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

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

您可能没有花足够的时间使用您已经找到的指南,或者我们需要查看堆栈跟踪。附加调试器很容易,如果代码抛出异常,你就会领先。但它没有,像这样的挂起不会抛出。练习调试这个特殊的简单挂起以了解如何做到这一点:

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

一般来说,用户控件中可能导致挂起的代码的主要候选者是它的构造函数、它的 Load 事件和它的 Paint 事件。使用DesignMode property 绕过在设计器内部而不是常规进程内部运行时可能无法正常工作的危险代码。并且要注意先有鸡还是先有蛋的问题,如果您的 UserControl 中有一个简单的错误,那么它很容易在设计时首先出现,然后您才有机会像往常一样对其进行调试。可能需要禁用代码块来增加错误,使用 DesignMode 到达那里。

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

【讨论】:

  • devenv.exe 在尝试连接第二个实例的调试器时不是一个选项。我应该提到这一点。所以我连接到 WDExpress.exe。
  • 我还应该补充一点,这是一个成熟的自定义 UserControl,最近没有更改,并且在很多现有表单上使用。挂起仅在添加一个时发生;不是在设计包含一个现有表单时。
  • 这些 cmets 对推进这个 Q+A 非常没有帮助。如果你只想举起双手大喊“VS bug!”然后让我们不要为此烦恼。向我们展示堆栈跟踪。
  • 如果您向我提供了我由于不准确而无法遵循的说明,我们将不胜感激。
  • 到目前为止我所看到的一切都在谈论附加到 devenv.exe。 无论我选择了什么“调试这些代码类型”,在 Windows 任务管理器或 VS 的选择器中都没有列出 devenv.exe 进程
【解决方案2】:

在将 VS2013 更新到 12.0.40629.0 更新 5(通过选择 TOOLS > Extensions and Updates 发现时,该问题似乎已经消失,然后选择左侧的更新

它可能不适用于设计器中看似莫名其妙的 UserControl 引发的挂起的所有情况,但它似乎为我解决了问题。我把这个放在这里(而不是删除问题),以防我的经验可以帮助其他人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    相关资源
    最近更新 更多