2013-11-22 49 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