尝试将以下代码放入其中Load
WinForms 的事件处理程序或Loaded
对于 WPF。
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
事件到目前为止。
将此代码放入按钮即可使其工作。
- 受影响的构建
配置=任意。默认情况下尝试过
Debug
and Release
.
为什么我认为它是一个错误,因为它会使对象处于不稳定状态 - 它们没有完成初始化,这不是预期的行为。重要的是没有人会知道它发生了,因为它不会抛出异常。根据您的设计,您最终可能会在数据库中得到不正确的数据,这在最坏的情况下可能会导致严重的后果。
有谁能很好地解释为什么会发生这种情况以及是否有解决方法?
该问题是由 wow64 模拟层引起的,当您在 x64 操作系统上定位 x86 平台时,该模拟层就会发挥作用。
它吞掉负责触发 Load 事件的代码中的异常。
因此,调试器看不到异常,也无法介入处理这种情况。
这篇文章似乎记录了那么那里发生了什么,
之前的这个回答汉斯·帕桑特(Hans Passant)(所有的功劳和赞成票都归于他)解释了可能的解决方法。
我最喜欢的一个是将所有内容移出 Form_Load 事件并将有问题的代码放入表单构造函数中。 (当然不知道是否适用于你的情况)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)