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

解释Visual Studio 2010及更高版本、WinForms和WPF中的关键错误,wpf,winforms,form-load,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(我可以测试这些IDE)。2010重置堆栈状态,并从sub/handle

尝试将以下代码放入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(我可以测试这些IDE)。2010重置堆栈状态,并从sub/handler返回,就像什么都没发生一样(但不继续处理其他语句)。2012可能会警告用户应用程序失败以及试图在兼容模式下运行。之后的下一次运行与2010年相同。2008正确抛出异常,但仅在默认配置(AnyCPU)上。将平台目标切换到x86也会使问题在2008年再次出现
  • 受影响的框架是WinForms和WPF。控制台应用程序和ASP.NET 似乎工作得很好。NET v2.0-4.5
  • 到目前为止,受影响的范围仅为加载事件。 将此代码放到按钮中可以使其工作
  • 受影响的构建 配置=任何。在默认的
    Debug
    Release
    上尝试过

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


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

当您将x64操作系统上的x86平台作为目标时,问题是由wow64仿真层引起的。
它接受负责触发加载事件的代码中的异常。
因此,调试器看不到异常,无法介入处理该情况。
那里发生了什么事

Hans Passant(所有的积分和选票都归他所有)解释了可能的解决办法。

我的首选方法是将所有内容移出Form_Load事件,并将有问题的代码放入Form构造函数中。(当然我不知道它是否适用于您的情况)

哪个框架版本?尝试使用4.0版的LinqPAD,并按预期引发异常docs@Steve:全部可用,即.NET 2.0到4.5。我更新了问题。感谢您指出。XmlNameSpaceManager的构造函数代码的第二行是
this.xml=nameTable.Add(“xml”)其中nameTable是传递给构造函数的参数,后面跟着大量相同类型的调用。因此它应该立即抛出NullReferenceException。史蒂夫:没错,这就是它应该做的,也是它在vs2008上应该做的。谢谢你调查这件事。也许,您也可以在VisualStudio中测试它,看看是否可以复制?让我们确保不只是我的框架被破坏了。还有谁能重现同样的问题?也许这可以解释为什么我有很多不同形式的代码,历史上都是这样。现在我有充分的理由重新考虑我的设计。谢谢你的挖掘。我也在VS2008上重新测试了,问题依然存在。我之前没有注意到这一点是因为VS2008默认创建了一个面向任何CPU的应用程序,而不像2010和2012,后者的默认值是x86。将VS2008放到x86之后,我也遇到了同样的问题,因此它与IDE的选择完全无关。