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

当我创建一个新项目,我得到一个奇怪的行为未处理的异常。这是我可以重现的问题:

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->例外中的框。但是,即使我在try-catch块中处理异常,执行也会中断;这也不是我想要的。如果我记得正确,在这个对话框中有一个名为“未处理的异常”或类似这样的列,它会做我想要的东西。但在我的项目中只有一列(“Thrown”)。

这是一个由wow64仿真层引起的讨厌的问题,它允许32位代码在64位版本的Windows 7上运行。它会在响应64位窗口管理器生成的通知的代码中吞入异常,如Load事件。防止调试器看到它​​,并进入。这个问题很难解决,微软的Windows和DevDiv组指向来回。 DevDiv不能做任何事情,Windows认为这是正确的和记录的行为,神秘的那个声音。

它肯定是documented,但几乎没有人理解后果或认为这是合理的行为。特别是当窗口过程从视图隐藏时,当然,就像在任何项目中使用包装类隐藏窗口管道。像任何Winforms,WPF或MFC应用程序。基本问题是微软无法弄清楚如何将异常从32位代码流回到触发通知回到尝试处理或调试异常的32位代码的64位代码。

这只是一个附加的调试器的问题,你的代码将像往常一样没有一个。

项目>属性> “制作”标签>平台目标= AnyCPU和untick首选32位。您的应用程序现在将作为64位进程运行,从而消除wow64失败模式。一些后果,它禁用VS2013之前的VS版本的编辑继续,并且可能不总是可能的,当您有依赖于32位代码。

其他可能的解决方法:

>调试>例外>在Thrown框中选中CLR异常,强制调试器在引发异常的代码行停止。
>在load事件处理程序中写try / catch,并在catch块中failfast。
>在Main()方法中使用Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException),以便在调试模式下不会禁用消息循环中的异常陷阱。这使得所有未处理的异常难以调试,ThreadException事件是没有用的。
>考虑你的代码是否真的属于Load事件处理程序。它是非常罕见的需要它,它是非常流行在VB.NET和一只天鹅歌,因为它是默认事件,双击轻轻地添加事件处理程序。当你对用户偏好和自动缩放应用后的实际窗口大小感兴趣时,你真的需要加载。一切都属于构造函数。
>更新到Windows 8或更高版本,他们有这个wow64问题解决。

http://stackoverflow.com/questions/4933958/vs2010-does-not-show-unhandled-exception-message-in-a-winforms-application-on-a

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – VS2010不会在64位版本的Windows上的WinForms应用程序中显示未处理的异常消息