gpt4 book ai didi

.net - WPF 应用程序崩溃随机报告内部错误,退出代码为 80131506

转载 作者:行者123 更新时间:2023-12-03 15:49:18 25 4
gpt4 key购买 nike

我的 WPF 应用程序随机崩溃(但每天至少两次)遇到问题,在 Windows 应用程序日志中留下以下消息:

Application: AppName.exe Framework Version: v4.0.30319 Description: The process was terminated due to an internal error in the .NET Runtime at IP xxxxxxxx (xxxxxxxx) with exit code 80131506.



只是为您提供背景知识,此应用程序在运行 Windows Embedded Standard 2009 的嵌入式系统上运行,并且与另一个进程一起是设备上运行的唯一应用程序(即使资源管理器也被禁用,因为它不需要)。

经过一些试错调查,我已经隔离了触发错误的代码。它是一个安装在主窗口上的钩子(Hook),用于拦截 HWND 消息以了解监视器何时关闭或处于待机模式。
由于系统配备了触摸面板,我在显示器关闭时用面板覆盖了我的应用程序主窗口,因此当用户触摸显示器使其退出待机模式时,它不会错误地单击我的按钮之一主窗口。当面板本身收到“点击”事件时,它会关闭、消失,从而允许用户恢复正常操作。

这是我如何实例化钩子(Hook)和在拦截 hwnd 时调用的函数:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
WindowInteropHelper helper = new WindowInteropHelper(this);
HwndSource.FromHwnd(helper.Handle).AddHook(HwndSourceHookHandler);
}

private IntPtr HwndSourceHookHandler(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
handled = false;

if (msg == WM_SYSCOMMAND && wParam == (IntPtr)SC_MONITORPOWER)
{
if (lParam == (IntPtr)MONITOR_OFF || lParam == (IntPtr)MONITOR_STANDBY)
{
AppName.Shell.canvasStandBy.Visibility = System.Windows.Visibility.Visible;
}
}
return IntPtr.Zero;
}

如果我注释掉 Window_Loaded 位中的代码,则不再发生崩溃...
你能指出这段代码有什么问题,或者给我一个提示,让我知道另一种方法,这样用户在监视器关闭时点击监视器就不会到达底层的主窗口?

在此先感谢您的帮助 :)

最佳答案

解决了问题。 @HansPassant 是对的。真正的问题不在于钩子(Hook)调用,而在于使用了一些错误签名的 P/INVOKES 的外部第三方 DLL(包含应用程序中使用的一些自定义控件)。 Hook 调用只是通过在没有人使用设备时以某种方式强制垃圾收集器进行干预来触发问题,从而检测自自定义控件被实例化以来一直存在的堆损坏。
解决方案是:从开发人员那里获得更新的、固定的 DLL,问题不再存在 :)
感谢大家的帮助。

关于.net - WPF 应用程序崩溃随机报告内部错误,退出代码为 80131506,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20146604/

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