将 UserControl 添加到窗体时 VS2013 挂起
VS2013 Hangs when Adding UserControl to Form
最好的解释方法是描述我如何随意重现该问题。
- 在设计器中打开现有的 Windows 表单文件
- 打开工具箱并单击自定义 UserControl
- 在设计器中的表单中单击以添加它
- VS2013 挂起(不崩溃);杀死 VS2013 并重新启动它
- 再次打开表格
- 重置工具箱并重新添加包含我的自定义用户控件的 DLL
- 尝试将控件添加到表单中 -- 它工作得很好!
- 关闭 VS2013
- 打开 VS2013
- 重复将自定义 UserControl 添加到窗体的任务
- VS2013 挂起
所以,故事的寓意是在关闭并重新打开 VS2013 后,任何添加自定义用户控件的尝试都会挂起 VS2013,唯一的补救方法是重置工具箱并重新添加用户控件 DLL ;该补救措施仅持续到 VS2013 退出并再次启动。
很多谷歌搜索已经产生了关于使用第二个 VS 实例附加到第一个实例并查看抛出的异常的建议,但没有抛出异常;应用程序挂起。
我发现最接近描述我的问题的一件事原来与我没有使用的一些远程桌面软件有关。
有人有什么想法吗?我没有尝试重新安装 Visual Studio,因为这代表了相当长的停机时间。万不得已的事情(我读过一些表明它不会有帮助的东西)。
编辑:显然有时 reset/re-add 不会 让它变得更好。
编辑:我应该提到的一些额外的事情:
- 尝试使用第二个VS实例时没有devenv.exe
调试,所以我最终选择 WDExpress.exe
- 特定的用户控件比较成熟,最近没有变化,在项目中的很多窗体上都在使用
- 问题仅在添加控件的新实例时出现;挂起 不会 只是通过尝试为已经包含一个表单的设计器启动设计器来发生。
- 最新的 VS2013 更新可能已修复它;它现在没有发生,我不想在完成我的工作之前再次尝试重现它来激怒众神。
使用自定义 UserControl 挂起 Visual Studio 非常 容易做到。一个简单的例子就够了,双击设计图面,写上:
private void UserControl1_Load(object sender, EventArgs e) {
while (true) { }
}
编译并将添加的控件从工具箱顶部拖放到窗体上。演出结束。
您可能没有花足够的时间使用您已经找到的指南,否则我们会有一个堆栈跟踪来查看。附加调试器非常简单,如果代码抛出异常,您将领先一步。但事实并非如此,像这样的挂起不会抛出。练习调试这个特别简单的挂起以找出如何做到这一点:
- 再次启动 VS,调试 > 附加到进程 > select devenv.exe
- 重要:点击进程列表上方的Select按钮。您需要 select "Debug these code types" 单选按钮并勾选 "Managed (v4.5, v4.0)" 以及 "Native"。现在单击附加。
- 给它时间来加载符号文件,需要很长时间,尤其是如果以前从未这样做过的话。
- 使用“调试”>“全部中断”。
- 如果您 幸运 那么它现在会停止在导致挂起的确切语句上。可能在这种情况下。然而,这是 不 保证的,它也可能在 devenv.exe 内 运行 的许多线程之一上中断,该线程恰好在确切的时刻处于活动状态调试器闯入了。
- 在这种情况下,您需要使用 Debug > Windows > Threads 来 select UserControl 代码所在的线程 运行。应该是标有 "Main Thread" 的那个。双击它。
- 如果编辑器没有切换到挂起的源代码文件,则使用调试 > Windows > 调用堆栈来了解挂起是如何发生的。如果您需要更多帮助,请使用该跟踪更新问题。
一般来说,UserControl 中可能导致挂起的代码的主要候选者是它的构造函数、它的 Load 事件和它的 Paint 事件。使用 DesignMode property 绕过在设计器而不是常规进程中运行时不太可能正常工作的危险代码。请注意先有鸡还是先有蛋的问题,如果您的 UserControl 中有一个普通的错误,那么在您有机会像往常一样调试它之前,它很容易在设计时首先出现。可能需要禁用代码块以增加错误,使用设计模式到达那里。
更详细一点,这被标记为[c++-cli]。您必须 select 旧的调试引擎来调试 C++/CLI 代码。工具 > 选项 > 调试 > 常规 > 勾选 "Use Managed Compatibility Mode" 复选框。
在将 VS2013 更新到 12.0.40629.0 Update 5 之后,问题似乎已经消失,通过选择 TOOLS > 扩展和更新,然后选择左侧的更新。
它可能不适用于设计器中看似莫名其妙的 UserControl 引发的挂起,但它似乎解决了我的问题。我把它放在这里(而不是删除问题)以防我的经验可以帮助其他人。
最好的解释方法是描述我如何随意重现该问题。
- 在设计器中打开现有的 Windows 表单文件
- 打开工具箱并单击自定义 UserControl
- 在设计器中的表单中单击以添加它
- VS2013 挂起(不崩溃);杀死 VS2013 并重新启动它
- 再次打开表格
- 重置工具箱并重新添加包含我的自定义用户控件的 DLL
- 尝试将控件添加到表单中 -- 它工作得很好!
- 关闭 VS2013
- 打开 VS2013
- 重复将自定义 UserControl 添加到窗体的任务
- VS2013 挂起
所以,故事的寓意是在关闭并重新打开 VS2013 后,任何添加自定义用户控件的尝试都会挂起 VS2013,唯一的补救方法是重置工具箱并重新添加用户控件 DLL ;该补救措施仅持续到 VS2013 退出并再次启动。
很多谷歌搜索已经产生了关于使用第二个 VS 实例附加到第一个实例并查看抛出的异常的建议,但没有抛出异常;应用程序挂起。
我发现最接近描述我的问题的一件事原来与我没有使用的一些远程桌面软件有关。
有人有什么想法吗?我没有尝试重新安装 Visual Studio,因为这代表了相当长的停机时间。万不得已的事情(我读过一些表明它不会有帮助的东西)。
编辑:显然有时 reset/re-add 不会 让它变得更好。
编辑:我应该提到的一些额外的事情:
- 尝试使用第二个VS实例时没有devenv.exe 调试,所以我最终选择 WDExpress.exe
- 特定的用户控件比较成熟,最近没有变化,在项目中的很多窗体上都在使用
- 问题仅在添加控件的新实例时出现;挂起 不会 只是通过尝试为已经包含一个表单的设计器启动设计器来发生。
- 最新的 VS2013 更新可能已修复它;它现在没有发生,我不想在完成我的工作之前再次尝试重现它来激怒众神。
使用自定义 UserControl 挂起 Visual Studio 非常 容易做到。一个简单的例子就够了,双击设计图面,写上:
private void UserControl1_Load(object sender, EventArgs e) {
while (true) { }
}
编译并将添加的控件从工具箱顶部拖放到窗体上。演出结束。
您可能没有花足够的时间使用您已经找到的指南,否则我们会有一个堆栈跟踪来查看。附加调试器非常简单,如果代码抛出异常,您将领先一步。但事实并非如此,像这样的挂起不会抛出。练习调试这个特别简单的挂起以找出如何做到这一点:
- 再次启动 VS,调试 > 附加到进程 > select devenv.exe
- 重要:点击进程列表上方的Select按钮。您需要 select "Debug these code types" 单选按钮并勾选 "Managed (v4.5, v4.0)" 以及 "Native"。现在单击附加。
- 给它时间来加载符号文件,需要很长时间,尤其是如果以前从未这样做过的话。
- 使用“调试”>“全部中断”。
- 如果您 幸运 那么它现在会停止在导致挂起的确切语句上。可能在这种情况下。然而,这是 不 保证的,它也可能在 devenv.exe 内 运行 的许多线程之一上中断,该线程恰好在确切的时刻处于活动状态调试器闯入了。
- 在这种情况下,您需要使用 Debug > Windows > Threads 来 select UserControl 代码所在的线程 运行。应该是标有 "Main Thread" 的那个。双击它。
- 如果编辑器没有切换到挂起的源代码文件,则使用调试 > Windows > 调用堆栈来了解挂起是如何发生的。如果您需要更多帮助,请使用该跟踪更新问题。
一般来说,UserControl 中可能导致挂起的代码的主要候选者是它的构造函数、它的 Load 事件和它的 Paint 事件。使用 DesignMode property 绕过在设计器而不是常规进程中运行时不太可能正常工作的危险代码。请注意先有鸡还是先有蛋的问题,如果您的 UserControl 中有一个普通的错误,那么在您有机会像往常一样调试它之前,它很容易在设计时首先出现。可能需要禁用代码块以增加错误,使用设计模式到达那里。
更详细一点,这被标记为[c++-cli]。您必须 select 旧的调试引擎来调试 C++/CLI 代码。工具 > 选项 > 调试 > 常规 > 勾选 "Use Managed Compatibility Mode" 复选框。
在将 VS2013 更新到 12.0.40629.0 Update 5 之后,问题似乎已经消失,通过选择 TOOLS > 扩展和更新,然后选择左侧的更新。
它可能不适用于设计器中看似莫名其妙的 UserControl 引发的挂起,但它似乎解决了我的问题。我把它放在这里(而不是删除问题)以防我的经验可以帮助其他人。