2012-03-15 14 views
3

私はいくつかのWindowsFormHostコントロールを必要とするWPFウィンドウを持っています。私は、このようなコントロールをモデル化すると例外が表面に泡立ちませんし、静かに処理されることに気付きました。つまり、SharpDevelopのデバッグオプション '処理された例外の一時停止'を使用してのみ表示されます。WindowsFormsHostコントロール - 例外処理

この現象を回避するにはどうすればよいですか?

これは、WindowのLoaded Event Handlerコードで例外をスローすることでこれをテストしました。 WindowsFormsHostコントロールの1つをコメントアウトすると、例外処理が正常に行われ、コードが破損しますが、以下のコードに示すように、例外がキャッチされたようにウィンドウが表示されます。

<?xml version="1.0" encoding="utf-8"?> 
    <Window 
     x:Class="TEST.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="TEST" 
     Height="300" 
     Width="300"> 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition 
        Height="150" /> 
       <RowDefinition 
        Height="150" /> 
      </Grid.RowDefinitions> 
      <WindowsFormsHost Grid.Row="0" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" /> 
      <WindowsFormsHost Grid.Row="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" /> 
     </Grid> 
    </Window> 

/// <summary> 
/// Interaction logic for Window1.xaml 
/// </summary> 
public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
     this.Loaded += new RoutedEventHandler(Window1_Loaded); 
    } 

    void Window1_Loaded(object sender, RoutedEventArgs e) 
    { 
     throw new ApplicationException("TEST"); 
    } 
} 
+0

[VS2010は64ビットWinFormsアプリケーションで未処理の例外メッセージを表示しません] ://stackoverflow.com/questions/4933958/vs2010-does-not-show-unhandled-exception-message-in-a-64-bit-winforms-applicatio) –

+0

@Hans Passant、 'Imは32bit windows xp、compilerを使用していますx86プロセッサ用に最適化されています。 – LiamV

答えて

1

これは、WindowsフォームテクノロジのWindowsメッセージを処理するためにWindowsFormsHostが作成する中間のWindows interopスタックが原因です。

これはほぼ標準のNativeWindowクラスに基づいています。残念ながら、このクラスはデフォルトで例外を摂っています。反射板や他のIL検査ツールを使って見ることができます。デフォルトでは

private IntPtr Callback(IntPtr hWnd, int msg, IntPtr wparam, IntPtr lparam) 
{ 
    try 
    { 
     // process message 
    } 
    catch (Exception exception) 
    { 
     this.OnThreadException(exception); 
    } 
    ... 
} 

OnThreadException方法がある...空:このクラスの心は、この方法です。理論的には、WindowsFormsHostから派生したクラス、特にBuildWindowCoreメソッドを作成することができます。私はそれをやろうとしましたが、WindowsFormsHost実装がプライベートなstufをたくさん使っているので動作しません....