Winforms VS2013在向窗体添加UserControl时挂起
解释这一点的最好方法是描述我如何可以随意重现这个问题Winforms VS2013在向窗体添加UserControl时挂起,winforms,visual-studio-2013,user-controls,c++-cli,freeze,Winforms,Visual Studio 2013,User Controls,C++ Cli,Freeze,解释这一点的最好方法是描述我如何可以随意重现这个问题 在设计器中打开现有的Windows窗体文件 打开工具箱并单击自定义UserControl 在设计器中单击表单以添加它 VS2013挂起(不崩溃);杀死VS2013并重新启动它 再次打开表单 重置工具箱并重新添加包含自定义UserControl的DLL 尝试将控件添加到表单中--它工作得很好 关闭VS2013 开放式VS2013 重复将自定义UserControl添加到表单的任务 VS2013挂起 因此,这个故事的寓意是,在关闭并重新打开VS2
- 当我尝试使用第二个VS实例创建时,没有devenv.exe 调试,所以我最终选择了WDExpress.exe
- 特定的用户控件是成熟的,最近没有更改,并且在项目中的许多表单上使用
- 该问题仅在添加控件的新实例时发生;挂起不会仅仅通过尝试为已包含挂起的窗体启动设计器而发生
- 最新的VS2013更新可能已经修复了它;这件事现在还没有发生,我也不想在我完成工作之前再次复制它,从而激怒众神
private void UserControl1_Load(object sender, EventArgs e) {
while (true) { }
}
从工具箱顶部编译并删除添加的控件,然后将其放到窗体上。演出结束了
您可能没有花足够的时间使用已经找到的指南,或者我们需要查看堆栈跟踪。附加调试器非常简单,如果代码引发异常,您将领先。但事实并非如此,像这样的吊球是不会丢的。练习调试此特定的简单挂起以了解如何执行此操作:
- 再次启动VS,调试>附加到进程>选择devenv.exe
- 重要提示:单击流程列表上方的选择按钮。您需要选择“调试这些代码类型”单选按钮,并勾选“托管(v4.5、v4.0)”和“本机”。现在单击“附加”
- 给它加载符号文件的时间,需要相当长的时间,特别是如果以前从未这样做过的话
- 使用调试>全部中断
- 如果你幸运的话,它现在会停在导致挂起的确切语句上。在这种情况下很可能。但这并不能保证,它也可能在devenv.exe中运行的多个线程中的一个线程上中断,而devenv.exe恰好在调试器中断时处于活动状态
- 在这种情况下,您需要使用Debug>Windows>Threads来选择运行UserControl代码的线程。应为标有“主螺纹”的螺纹。双击它
- 如果编辑器没有切换到带有挂起的源代码文件,那么使用Debug>Windows>callstack来了解挂起是如何发生的。如果需要更多帮助,请使用该跟踪更新问题
还有一个细节,标记为[c++-cli]。必须选择旧的调试引擎才能调试C++/CLI代码。工具>选项>调试>常规>勾选“使用托管兼容性模式”复选框。将VS2013更新为12.0.40629.0更新5后,该问题似乎已消失,方法是选择工具>扩展和更新,然后选择左侧的更新
它可能不适用于设计师中看似无法解释的用户控制引发挂起的所有情况,但它似乎解决了我的问题。我把这个放在这里(而不是删除这个问题),以防我的经验可以帮助其他人。devenv.exe在尝试连接第二个实例的调试器时不是一个选项。我应该提到这一点。因此,我连接到了WDExpress.exe。我还应该补充一点,这是一个成熟的自定义用户控件,最近没有更改,并且在许多现有表单上使用。挂起仅在添加一个时发生;当设计一个包含一个的现有表单时不是这样的。这些评论对于推动这个Q+A是非常没有帮助的。如果你只是想把你的手举到空中,大声喊“VS bug!”那么就不要再为这个费心了。向我们展示堆栈跟踪。如果您给我的指示不准确,我无法遵循,请提供有关如何获取堆栈跟踪的任何建议。我将不胜感激