gpt4 book ai didi

c# - 64 位计算机上的 32 位程序不会因 NullReferenceException 而崩溃

转载 作者:太空狗 更新时间:2023-10-29 18:18:22 27 4
gpt4 key购买 nike

我有一段代码抛出 NullReferenceException:

dataSource.DataSource = GetView();

它抛出是因为 dataSourcenullGetView 返回一个 DataTable

但是,当在一台计算机(64 位)上运行时,程序继续运行没有任何问题。异常确实发生了,因为当我迈出一步时,我最终完全到了其他地方。调试器不会停止。

当在另一个(32 位)上运行时,它抛出异常并且我的调试器停止。

我的程序是为 32 位编译的。当我切换到“任何 CPU”时,64 位计算机确实因异常而崩溃。

更新 我知道如何解决我的问题(事实上我已经知道了)。我只想知道这是某种已知行为还是可能由多种原因引起的行为。

修复方法是 1) 选择“Any CPU”(这会导致 64 位机器崩溃)和 2) 在运行此片段之前检查 dataSource 是否为 null。

最佳答案

太多的评论使重复的链接可见,所以我会把它作为一个答案。当您调试 32 位程序时,这是 64 位版本的 Vista 和 Win7 上的一个已知问题。当调度程序处理 Windows 消息并且消息的事件处理程序抛出未捕获的异常时,消息调度程序中通常有一个捕获未处理异常的后备程序。 通常 在 Winforms 上触发 Application.ThreadException 事件,在 WPF 上触发 Dispatcher.UnhandledException 事件。

然而,当您调试程序时,这些事件非常尴尬,这使得诊断未处理的异常变得困难。因此,当您在附加调试器的情况下启动程序时,将禁用此后退以允许调试器查看异常并显示异常助手。让您有机会解决问题。

Microsoft 对源自 64 位窗口管理器并不止一次遍历 Wow64 仿真层边界的某些消息存在问题。他们无法弄清楚如何让未处理的异常遍历这些层,异常信息与代码模型紧密相关。所以他们做了他们唯一能做的另一件事,他们捕获异常。这通常会激活应用程序兼容性对话框,让用户选择将异常视为良性异常,每个人都在该对话框中单击"is",因为他们不知道对话框要求什么并且希望他们的程序兼容。

这对您的调试尝试来说是非常致命的,调试器无法再看到未处理的异常,因为 Windows 捕获并吞下了它。所以你得到的正是你所描述的,代码只是停止运行而没有任何提示为什么。您只能在“输出”窗口中看到第一次机会异常通知,很容易错过。

我之前发布了有关此问题的答案,并记录了该问题的解决方法。你会找到它 here .

关于c# - 64 位计算机上的 32 位程序不会因 NullReferenceException 而崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21937186/

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