1

リフレクションを使用してWPFMVVMクラスライブラリを読み込みます。ここで説明するように、例外ハンドラーも必要です。

これはホステッドWPFアプリであるため、App.xamlを使用できません。ここで説明するように、アプリケーションをロードするクラスに必要なものをすべて実装したのはそのためです。

Application.Current.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(Current_DispatcherUnhandledException);

ここでの問題は、(backgroundworkerスレッドBTWから)例外をスローすると、うまく機能しないことです。実際、Dispatcher.Invokeを呼び出して(UIスレッドで例外をスローするために)手動でNullReferenceExceptionをスローし、Current_DispatcherUnhandledExceptionデバッガーに入ると、表示される例外はNullReferenceExceptionではなく、hellyTargetInvocationExceptionです。 「呼び出しのターゲットによって例外がスローされました」というメッセージが表示されます。

この例外は、リフレクションによってWPFdllを呼び出すinvokeメソッドによってスローされる可能性があることがわかりました。

NullReferenceExceptionは、wpfアプリケーションの前に「WPFクラスライブラリ呼び出し元メソッド」によってキャッチされているようです...

それは私を夢中にさせています!

助けてください !

4

1 に答える 1

2

実際、NullReferenceException は WPF フレームワークによってキャッチされ、TargetInvocationException にラップされます。元の NullReferenceException は、TargetInvocationException の InnerException フィールドで引き続き使用できます。

元の例外を取得する方法の例を次に示します。

public static void Main()
{
    Dispatcher mainThreadDispatcher = Dispatcher.CurrentDispatcher;

    mainThreadDispatcher.UnhandledException += new DispatcherUnhandledExceptionEventHandler(mainThreadDispatcher_UnhandledException);

    // Setup a thread that throws an exception on the main thread dispatcher.
    Thread t = new Thread(() =>
        {
            mainThreadDispatcher.Invoke(new Action(
                () =>
                {
                    throw new NullReferenceException();
                }));
        });

    t.Start();

    // Start the dispatcher on the main thread.
    Dispatcher.Run();
}

private static void mainThreadDispatcher_UnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
    Exception targetInvocationException = e.Exception; // e.Exception is a TargetInvocationException
    Exception nullReferenceException = e.Exception.InnerException; // e.Exception.InnerException is the NullReferenceException thrown in the Invoke above
}
于 2011-08-03T09:01:41.830 に答える