7

尝试将以下代码放入WinForms 或WPF的Load事件处理程序中。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.

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

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

4

1 回答 1

2

这个问题是由 wow64 仿真层引起的,当您在 x64 操作系统上以 x86 平台为目标时,该层会发挥作用。
它吞下负责触发 Load 事件的代码中的异常。
因此,调试器看不到异常,也无法介入处理这种情况。
这篇文章似乎很好地记录了那里发生的事情,

Hans Passant 的这个先前的回答(所有的学分和赞成)解释了可能的解决方法。
我最喜欢的是将所有内容移出 Form_Load 事件并将有问题的代码放入表单构造函数中。(当然我不知道它是否适用于你的情况)

于 2012-10-31T22:33:13.517 回答