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

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

  • 在设计器中打开现有的Windows窗体文件
  • 打开工具箱并单击自定义UserControl
  • 在设计器中单击表单以添加它
  • VS2013挂起(不崩溃);杀死VS2013并重新启动它
  • 再次打开表单
  • 重置工具箱并重新添加包含自定义UserControl的DLL
  • 尝试将控件添加到表单中--它工作得很好
  • 关闭VS2013
  • 开放式VS2013
  • 重复将自定义UserControl添加到表单的任务
  • VS2013挂起
  • 因此,这个故事的寓意是,在关闭并重新打开VS2013之后,任何添加自定义usercontrol的尝试都将挂起VS2013,唯一的补救方法是重置工具箱并重新添加usercontrol DLL;这种补救措施只会持续到VS2013退出并再次启动

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

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

    有人有什么想法吗?我还没有尝试重新安装VisualStudio,因为这意味着相当长的停机时间。最后一种手段(我读到一些东西表明它不会有帮助)

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

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

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

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

        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来了解挂起是如何发生的。如果需要更多帮助,请使用该跟踪更新问题
    通常,UserControl中可能导致挂起的主要候选代码是其构造函数、加载事件和绘制事件。使用可以绕过在设计器中而不是在常规进程中运行时可能无法正常工作的危险代码。还要注意鸡和蛋的问题,若你们的用户控件中有一个普通的bug,那个么它很容易在设计时首先攻击你们,然后你们才有机会像平常一样调试它。禁用代码块可能是增加bug所必需的,使用DesignMode即可实现


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

    将VS2013更新为12.0.40629.0更新5后,该问题似乎已消失,方法是选择工具>扩展和更新,然后选择左侧的更新


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

    devenv.exe在尝试连接第二个实例的调试器时不是一个选项。我应该提到这一点。因此,我连接到了WDExpress.exe。我还应该补充一点,这是一个成熟的自定义用户控件,最近没有更改,并且在许多现有表单上使用。挂起仅在添加一个时发生;当设计一个包含一个的现有表单时不是这样的。这些评论对于推动这个Q+A是非常没有帮助的。如果你只是想把你的手举到空中,大声喊“VS bug!”那么就不要再为这个费心了。向我们展示堆栈跟踪。如果您给我的指示不准确,我无法遵循,请提供有关如何获取堆栈跟踪的任何建议。我将不胜感激