gpt4 book ai didi

c# - VS2010 不会在 64 位版本的 Windows 上的 WinForms 应用程序中显示未处理的异常消息

转载 作者:太空宇宙 更新时间:2023-11-03 15:45:58 25 4
gpt4 key购买 nike

当我创建一个新项目时,我遇到了未处理异常的奇怪行为。这就是我重现问题的方法:

1) 创建一个新的 Windows 窗体应用程序(C#、.NET Framework 4、VS2010)

2) 将以下代码添加到 Form1_Load 处理程序中:

int vara = 5, varb = 0;
int varc = vara / varb;
int vard = 7;

我希望 VS 中断并在第二行显示未处理的异常消息。然而,第三行被跳过,没有任何消息,应用程序继续运行。

我现有的 C# 项目没有这个问题。所以我猜我的新项目是用一些奇怪的默认设置创建的。

有人知道我的项目有什么问题吗???

我尝试选中 Debug->Exceptions 中的复选框。但是即使我在 try-catch block 中处理异常,执行也会中断;这也不是我想要的。如果我没记错的话,在这个对话框中有一列叫做“未处理的异常”或类似的东西,它可以完全满足我的要求。但是在我的项目中只有一列(“抛出”)。

最佳答案

这是一个令人讨厌的问题,由允许 32 位代码在 64 位版本的 Windows 7 上运行的 wow64 仿真层引起。它吞噬代码中的异常,以响应由 64-位窗口管理器,如 Load 事件。防止调试器看到它​​并介入。这个问题很难解决,Microsoft 的 Windows 和 DevDiv 组相互指责。 DevDiv 对此无能为力,Windows 认为这是正确且记录在案的行为,听起来很神秘。

当然是documented但几乎没有人理解后果或认为这是合理的行为。当然,尤其是当窗口过程从 View 中隐藏时,就像在任何使用包装类隐藏窗口管道的项目中一样。与任何 Winforms、WPF 或 MFC 应用程序一样。根本问题是 Microsoft 无法弄清楚如何将异常从 32 位代码流回触发通知的 64 位代码,再流回尝试处理或调试异常的 32 位代码。

这只是附加调试器的问题,如果没有附加调试器,您的代码将像往常一样崩溃。

Project > Properties > Build 选项卡 > Platform target = AnyCPU 并取消勾选 Prefer 32-bit。您的应用程序现在将作为 64 位进程运行,消除了 wow64 故障模式。一些后果,它会禁用 VS2013 之前的 VS 版本的编辑 + 继续,并且当您依赖 32 位代码时可能并不总是可行。

其他可能的解决方法:

  • 调试 > 异常 > 勾选 CLR 异常的抛出框以强制调试器在抛出异常的代码行处停止。
  • Load 事件处理程序中编写 try/catch,在 catch block 中编写 failfast。
  • Main() 方法中使用 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException) 以便在 Debug模式下不会禁用消息循环中的异常陷阱。然而,这使得所有未处理的异常都难以调试,ThreadException 事件非常无用。
  • 考虑您的代码是否真的属于Load 事件处理程序。很少需要它,但它在 VB.NET 中非常流行,并且是一首绝唱,因为它是默认事件,双击会简单地添加事件处理程序。只有当您对应用用户首选项和自动缩放后的实际窗口大小时感兴趣时,您才真的需要Load。其他一切都属于构造函数。
  • 更新到 Windows 8 或更高版本,他们已经解决了这个 wow64 问题。

关于c# - VS2010 不会在 64 位版本的 Windows 上的 WinForms 应用程序中显示未处理的异常消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28125612/

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