gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:02:42 25 4
gpt4 key购买 nike

尝试将以下代码放入 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 重置堆栈状态,并从 sub/handler 返回,就像什么也没发生一样(但没有继续执行那里的其他语句)。 2012 可能会警告用户有关失败的应用程序和试图在 compatibility mode 中运行的情况。 .下次它运行与 2010 相同。2008 正确抛出异常,但仅限于默认配置(AnyCPU)。将平台目标切换到 x86 也会使该问题在 2008 年再次出现。
  • 受影响的框架是 WinForms 和 WPF。控制台应用程序和 ASP.NET
    似乎工作正常。 .NET v2.0-4.5。
  • 受影响的范围只有 Load事件到此为止。
    将此代码放入按钮使其工作。
  • 受影响的构建
    配置 = 任何。试过默认 DebugRelease .

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

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

    最佳答案

    该问题是由 wow64 仿真层引起的,当您在 x64 操作系统上针对 x86 平台时,该层会发挥作用。
    它吞下负责触发 Load 事件的代码中的异常。
    因此,调试器看不到异常,也无法介入处理这种情况。
    This article seems to document那里发生了什么事,

    This previous answer来自 Hans Passant(所有的功劳和赞成票)解释了可能的解决方法。
    我最喜欢的方法是将所有内容从 Form_Load 事件中移出,并将有问题的代码放入表单构造函数中。 (当然我不知道它是否适用于你的情况)

    关于wpf - 解释 Visual Studio 2010 及更高版本、WinForms 和 WPF 中的关键错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13161947/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com