将UserControl添加到表单

时间:2015-11-06 16:55:22

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

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

  1. 在设计器中打开现有的Windows窗体文件
  2. 打开工具箱并单击自定义UserControl
  3. 点击设计器中的表单添加
  4. VS2013挂起(不会崩溃);杀死VS2013并重新启动它
  5. 再次打开表单
  6. 重置工具箱并重新添加包含我的自定义UserControls的DLL
  7. 尝试将控件添加到表单中 - 它工作得很好!
  8. 关闭VS2013
  9. 打开VS2013
  10. 重复将自定义UserControl添加到表单
  11. 的任务
  12. VS2013挂起
  13. 所以,故事的寓意是在关闭并重新打开VS2013之后,任何添加自定义用户控件的尝试都将挂起VS2013,唯一的解决方法是重置工具箱并重新添加用户控件DLL;补救措施只会持续到VS2013退出并重新启动。

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

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

    有人有任何想法吗?我没有尝试重新安装Visual Studio,因为这代表了相当多的停机时间。最后的事情(我读过一些表明它没用的东西)。

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

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

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

2 个答案:

答案 0 :(得分:1)

使用自定义UserControl挂起Visual Studio非常容易 。只需一个简单的例子,双击设计图面并写下:

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

从工具箱顶部编译并删除添加的控件并将其放在表单上。秀结束了。

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

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

通常,UserControl中可能导致挂起的代码的主要候选者是其构造函数,其Load事件及其Paint事件。使用DesignMode property来绕过在设计器内部而不是常规进程中运行时不太可能正常工作的危险代码。并且要注意鸡和蛋的问题,如果你的UserControl中有一个普通的错误,那么它就可以在你有机会像往常一样调试它之前在设计时轻松敲击。可能需要禁用代码块以增加错误,使用DesignMode到达那里。

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

答案 1 :(得分:0)

在将VS2013更新为 12.0.40629.0 Update 5 之后,问题似乎已经消失,通过选择 TOOLS >找到扩展程序和更新,然后选择左侧的更新

它可能不适用于设计师看似无法解释的UserControl煽动挂起的所有情况,但它似乎为我解决了这个问题。我把它放在这里(而不是删除问题),以防我的经验可以帮助别人。