2013-11-22 525 views
2

我有我的WPF应用程序崩溃随机(但每天至少两次)在Windows应用程序日志中留下以下消息的问题:WPF应用程序崩溃随机报告,退出代码内部错误80131506

应用:AppName的.EXE Framework版本:v4.0.30319 说明:该进程被终止,由于在IP XXXXXXXX(XXXXXXXX),退出代码.NET运行时的内部错误80131506.

只给你的背景下,此应用程序在嵌入式上运行运行Windows Embedded Standard 2009的系统,并且与另一个进程一起是设备上运行的唯一应用程序(即使浏览器由于不需要而被禁用)。

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

这里是我实例化钩和功能,当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位的崩溃不会再发生了...... 你能指出这段代码有什么问题吗?或者给我一个暗示,让另一种方式来让它在显示器关闭的时候在显示器上的点击不能进入底层主窗口?

在此先感谢您的帮助:)

+0

ExecutionEngineException与它们一样糟糕,您必须破坏内部CLR状态。通常通过破坏GC堆。片段中没有任何内容可以轻松解释这一点。您可以考虑的替代方法是使用Dispatcher.BeginInvoke(),以便可见性分配在更合适的时间发生。 –

+0

你看过[http://support.microsoft.com/kb/2640103](http://support.microsoft.com/kb/2640103)? – sthotakura

+0

@sthotakura是的我已经获得了前几天从微软提到的修补程序,将它应用到我的测试系统,但错误仍然保持不变:( – Netrunner

回答

0

摸索出了问题。 @HansPassant是对的。 REAL问题不是挂钩调用,而是使用一些外部第三方DLL(包含应用程序中使用的一些自定义控件),它使用了一些错误签名的P/INVOKES。 Hook调用只是以某种方式触发问题,迫使垃圾收集器在没有人使用该设备时进行干预,从而检测自定制控件实例化之后已发生的堆损坏。 解决方法是:从开发人员处获得一个更新的固定DLL,问题不再存在:) 感谢大家的帮助。

+0

任何提示可以确定它可能是哪个dll? – DefenestrationDay