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

Neo*_*isk 7 wpf winforms form-load

尝试将以下代码放在LoadWinForms或LoadedWPF的事件处理程序中.

Dim doc As New XmlDocument
Dim nsmgr As New XmlNamespaceManager(Nothing) 'this line throws an exception
Run Code Online (Sandbox Code Playgroud)

问题是不抛出异常,并发生堆栈损坏.它可能有不同的副作用,具体取决于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.

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

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

Ste*_*eve 2

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

汉斯·帕桑特(Hans Passant)之前的回答(所有的积分和赞成票都归于该答案)解释了可能的解决方法。
我最喜欢的一个是将所有内容移出 Form_Load 事件并将有问题的代码放入表单构造函数中。(当然不知道是否适用于你的情况)