解释Visual Studio 2010及更高版本,WinForms和WPF中的关键错误

时间:2012-10-31 15:56:45

标签: wpf winforms form-load

尝试将以下代码放在WinForms的Load事件处理程序或WPF的Loaded中。

Dim doc As New XmlDocument
Dim nsmgr As New XmlNamespaceManager(Nothing) 'this line throws an exception

问题是不会抛出异常,并且会发生堆栈损坏。它可能有不同的副作用,具体取决于IDE - 见下文。

  • 受影响的IDE是:2008年,2010年和2012年(我可以测试的)。 2010重置堆栈状态,并从子/处理程序返回,就像没有发生任何事情(但没有继续其他语句)。 2012可能会警告用户应用程序失败并尝试在compatibility mode中运行。之后的下一次运行与2010年相同.2008正确抛出异常,但仅限于默认配置(AnyCPU)。将平台目标切换到x86也会使问题再次出现在2008年。
  • 受影响的框架是WinForms和WPF。控制台应用程序和ASP.NET 似乎工作正常。 .NET v2.0-4.5。
  • 到目前为止,受影响的范围仅为Load事件。 将此代码放入按钮可以使其正常工作。
  • 受影响的构建 配置=任何。试用默认DebugRelease

为什么我认为它是一个错误是因为它可以使对象处于不稳定状态 - 它们没有完成初始化,这不是预期的行为。重要的是,没有人会知道它发生了,因为它不会引发异常。根据您的设计,您最终可能会在数据库中显示不正确的数据,这在最坏的情况下可能会导致严重的后果。

有没有人能够解释为什么会发生这种情况以及是否有解决方法?

1 个答案:

答案 0 :(得分:2)

问题是由在x64操作系统上定位x86平台时发挥作用的wow64仿真层引起的。
它吞下了负责触发Load事件的代码中的异常 因此,调试器不会看到异常,也无法介入处理该情况 This article seems to document那里发生了什么,

Hans Passant的

This previous answer解释了可能的解决方法。 我最喜欢的是将所有内容移出Form_Load事件,并将有问题的代码放在表单构造函数中。 (当然我不知道它是否适用于您的情况)