【发布时间】:2012-10-21 03:32:18
【问题描述】:
尝试将以下代码放入 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事件。 将此代码放入按钮中即可使用。 - 受影响的构建
配置=任何。尝试使用默认的
Debug和Release。
为什么我认为这是一个错误,因为它会使对象处于不稳定状态——它们没有完成初始化,这不是预期的行为。关键是没有人会知道它发生了,因为它不会抛出异常。根据您的设计,您最终可能会在数据库中得到不正确的数据,在最坏的情况下可能会导致严重的后果。
有没有人很好地解释为什么会发生这种情况以及是否有解决方法?
【问题讨论】:
-
哪个框架版本?尝试使用 4.0 的 LinqPAD 并按照文档的预期抛出异常
-
@Steve:全部可用,这意味着 .NET 2.0 到 4.5。我更新了问题。感谢您指出。
-
XmlNameSpaceManager的构造函数代码的第二行是
this.xml = nameTable.Add("xml");,其中nameTable是传递给构造函数的参数,后面是无数同类型的调用。所以它应该立即抛出 NullReferenceException。确实非常奇怪的行为。 -
@Steve:确切地说,这就是它应该做的,以及它在 vs2008 上所做的。感谢您查看这个。也许,您也可以在 Visual Studio 中对其进行测试,看看是否可以重现?让我们确保不只是我的框架以某种方式损坏。还有谁能重现同样的问题?