WPF

2016-12-07 15 views
0
にDLL C++からの例外を未処理のハンドル

私のWPFアプリは、外部DLLのメソッドを使用しています(C++、UI、ちょうどロジックで何も)このように:UIスレッドとは別で呼び出さSomeWPFMethodWPF

[DllImport("myExternDll.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] 
     private static extern int externalMethod(string str); 

int SomeWPFMethod() 
{ 
    int res; 

    try 
    { 
     res = externalMethod(str); 
    } 
    catch(Exception e) 
    { 
     LogError(e) 
     return -1; 
    } 

    return res; 
} 

注、(もし本件)。 DLL内の何かが間違っている場合は

私は

を持っているタイプ 'System.AccessViolationException' の未処理の例外は、例外

を発生しました。

Aアプリに設定された処理できない例外の方法を持っているが、これは何もしません:

Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException; 

private void Current_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) 
     { 
      if (System.Diagnostics.Debugger.IsAttached) 
      { 
       e.Handled = false; 
       return; 
      } 

      ShowUnhandledException(e); 
     } 

がクラッシュからアプリケーションを防ぐために、例外を処理するために何とか可能はありますか?

externメソッドが失敗した場合、私は何もしたくありませんが、アプリケーションはまだ動作するはずです。今それは墜落した。

+0

これは、[.NET相互運用機能と例外処理](https://blogs.msdn.microsoft.com/liviuc/2009/10/13/net-interop-and-exception-handling-in-mixed-アプリケーション/) –

+0

[WPFのWinformsコンポーネントから未処理の例外を処理する]の可能な複製(http://stackoverflow.com/questions/8111334/handling-unhandled-exceptions-from-winforms-components-in-wpf) –

+0

>> Thomas 、 いいえ、これはWPFではなくWinFormsで動作します – Ksice

答えて

1

SomeWPFMethodはスレッドで呼び出されているので、それが唯一の未処理の例外をキャッチするので

Application.Current.DispatcherUnhandledException

はこの例外をキャッチすることができなくなり、UIスレッドとは別WPFによって作成されたメインのUIスレッド。

は、あなたがそれは、特定のアプリケーションドメインのコンテキストで実行されているすべてのスレッドから生成された未処理の例外をキャッチし

AppDomain.CurrentDomain.UnhandledException

を使用する必要があるようです。

あなたは偉大な深さでWPFで例外を未処理の処理するための適切な方法をカバーし、次の記事を参照することができます -

https://dzone.com/articles/order-chaos-handling-unhandled

https://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx

ホープこれはあなたの問題を解決します。