C# 通用应用程序未处理的异常(KERNELBASE.DLL)
晚上好, 我正在开发一个通用应用程序。在几次随机崩溃和调试本机代码之后,我发现本机异常是:“AssemblyName.UniversalApp.WindowsPhone.exe中0x777E35D7(KERNELBASE.DLL)处未处理的异常:0xC0000002:请求的操作未实现。” 下面是反汇编中的异常。条目777E35D7丢失,这是应用程序崩溃的地方C# 通用应用程序未处理的异常(KERNELBASE.DLL),c#,exception,windows-phone-8.1,windows-8.1,win-universal-app,C#,Exception,Windows Phone 8.1,Windows 8.1,Win Universal App,晚上好, 我正在开发一个通用应用程序。在几次随机崩溃和调试本机代码之后,我发现本机异常是:“AssemblyName.UniversalApp.WindowsPhone.exe中0x777E35D7(KERNELBASE.DLL)处未处理的异常:0xC0000002:请求的操作未实现。” 下面是反汇编中的异常。条目777E35D7丢失,这是应用程序崩溃的地方 RaiseException: 777E35A0 push {r11,lr} 777E35A4 mov
RaiseException:
777E35A0 push {r11,lr}
777E35A4 mov r11,sp
777E35A6 bl __security_push_cookie (777CC868h)
777E35AA sub sp,sp,#0x54
777E35AC and r1,r1,#1
777E35B0 str r1,[sp,#4]
777E35B2 movs r1,#0
777E35B4 str r1,[sp,#8]
777E35B6 ldr r1,RaiseException+50h (777E35F0h)
777E35B8 str r0,[sp]
777E35BA str r1,[sp,#0xC]
777E35BC cbz r3,RaiseException+40h (777E35E0h)
777E35BE cmp r2,#0xF
777E35C0 bhi RaiseException+46h (777E35E6h)
777E35C2 str r2,[sp,#0x10]
777E35C4 lsls r2,r2,#2
777E35C6 add r0,sp,#0x14
777E35C8 mov r1,r3
777E35CA bl memcpy (7781ECC4h)
777E35CE ldr r3,RaiseException+4Ch (777E35ECh)
777E35D0 mov r0,sp
777E35D2 ldr r3,[r3]
777E35D4 blx r3
777E35D6 add sp,sp,#0x54
777E35D8 bl __security_pop_cookie (777CC880h)
777E35DC pop {r11,pc}
777E35E0 movs r3,#0
777E35E2 str r3,[sp,#0x10]
777E35E4 b RaiseException+2Eh (777E35CEh)
777E35E6 movs r2,#0xF
777E35E8 b RaiseException+22h (777E35C2h)
777E35EA __debugbreak
777E35EC ?? ??
777E35EE strb r6,[r0,#0x1E]
777E35F0 adds r5,r5,#0xA1
777E35F2 strb r6,[r7,#0x1D]
产生此异常的原因:
Ionut正如Yasen在我上一篇文章的评论中所建议的,Windows Phone 8.1中的导航代码应该(默认情况下)在UI线程上运行 不幸的是(我仍在试图找出原因),ListBoxItem事件处理程序中的导航代码没有在UI线程下一直运行,因此在随机时间引发了“本机代码”异常。奇怪的是,抛出的异常没有提供任何关于UI线程的信息(就像我们在Windows Phone 8.0 Silverlight上收到的一样),但Yasen指出KERNELBASE.DLL错误与UI线程访问异常有着密切的联系(很高兴知道这一点,以备将来参考) 解决方案是使用Windows运行时调度器。您可以在下面找到最终有效的导航代码
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
if ((!Window.Current.Content as Frame).Navigate(typeof(ItemPage)))
{
throw new Exception("NavigationFailedExceptionMessage");
}
});
再次感谢你,亚森!您刚刚节省了大量的调试时间
问候,,
Ionut那么库不会抛出任何NotImplementedException。在VisualStudio中,如果您对NotImplementedException快速执行CTRL+SHIFT+F,则实际上没有结果?@Pierre Lucpinoult否,库是干净的。此外,它不是托管异常(库是源代码的一部分)。如果它被管理,我将在“UnhandledException”或“UnobservedTaskException”事件中捕获异常。我必须在非托管代码(KERNELBASE.DLL)中捕获异常;所以,请澄清:在selection changed事件处理程序中,您正在导航到另一个页面,这就是导致问题的原因?如果是这种情况,您是否可以尝试将页面导航排入调度程序的队列?(也就是说,调用它就像在UI线程中没有调用事件处理程序一样。)@yasen感谢您的建议!我不敢相信我没有想到UI线程的问题。在WindowsPhone8中,我总是使用Dispatcher在UI线程上执行代码。所以它现在起作用了!8.1 Dispatcher(用于导航)的代码是
wait Dispatcher.RunAsync(CoreDispatcherPriority.Normal,()=>{if(!Window.Current.Content as Frame).Navigate(typeof(ItemPage)){抛出新异常(“NavigationFailedExceptionMessage”);} });代码>。再次感谢你,亚森!我很高兴它解决了你的问题!:)我建议这样做是因为我只在与UI线程访问相关的错误中遇到过KERNELBASE.DLL。奇怪的是,在所有这些情况下,代码无论如何都应该在UI线程上运行,而且应该没有错误。似乎是WP8.1中的一个bug。编辑:如果你有时间的话,把这个问题的答案贴出来就好了。哦,上帝,谢谢。在进行导航之前,我就有了这个0xC0000002,但这只发生在开发者的WindowsPhone8.1预览版中,所以我花了很多天找到了解决方案。谢谢