C# 如何确定内核回调上下文中是否运行了代码?

C# 如何确定内核回调上下文中是否运行了代码?,c#,.net,windows,exception-handling,64-bit,C#,.net,Windows,Exception Handling,64 Bit,我们知道的情况和一些解决办法,例如在对的答复中提到的。() 一种解决方法是不要将代码放在直接或间接从内核回调调用的方法中。但是,这会影响多个事件和方法,通常不会记录是否从内核回调调用方法 是否有办法看到这一点,例如在调用堆栈中 (注意:我已经尝试抛出一个异常,并查看调试器将执行什么操作。这在大多数情况下都有效,但并不总是有效,例如WPF窗口中的异常。一旦关闭将永远不会触发调试器。因此,我正在寻找一种更可靠的方法。)否,除了从已知的有此问题的事件中工作之外,没有其他好的方法来区分。将EXE项目的目

我们知道的情况和一些解决办法,例如在对的答复中提到的。()

一种解决方法是不要将代码放在直接或间接从内核回调调用的方法中。但是,这会影响多个事件和方法,通常不会记录是否从内核回调调用方法

是否有办法看到这一点,例如在调用堆栈中


(注意:我已经尝试抛出一个异常,并查看调试器将执行什么操作。这在大多数情况下都有效,但并不总是有效,例如WPF窗口中的异常。一旦关闭将永远不会触发调试器。因此,我正在寻找一种更可靠的方法。)

否,除了从已知的有此问题的事件中工作之外,没有其他好的方法来区分。将EXE项目的目标平台设置更改为AnyCPU是一个非常简单的解决方法。@HansPassant:谢谢!但是为什么AnyCPU是一个解决方案呢?只要操作系统是64位的,32位和64位进程的行为都是一样的。(我在Win7上使用VS2010和VS2012。)嗯,不,这是由wow64仿真层引起的问题。它不存在于64位进程中。我会假设你遇到的任何问题实际上都不是那只鸭子。@HansPassant:对不起,“我看到同样的行为”是错误的。正确的说法是:“异常似乎被32位和64位进程吞没了。”。我又试了一次:新建WinForms应用程序,覆盖
OnLoad
,添加
抛出null
。在Win7 x64:32位进程上:异常似乎消失了。64位进程:调试器不会停止,但App Compat Assistant会启动。我记不清了,但我认为在XP上,调试器总是停止。我不知道是不是wow64层,但这是同一只鸭子,不是吗???它像那只鸭子一样嘎嘎叫。但我已经在我的机器上安装了Win7的时候对这个场景进行了大量测试。要知道,当进程以64位模式运行时,它们不会被吞没。这完全符合他们被吞下的原因,他们有一个异常穿越thunks的问题。我不想不相信你的话,也许从那以后就有通过Windows Update发布的补丁改变了行为,听起来很难做到。我不能再测试这个了,这个问题在Win8中已经解决了。这只是调试过程中的一个问题。