2

Excel相互運用機能コンポーネントのイベントにアタッチされているデリゲートがあります。目標は、Excelからの更新された情報でwinformsコントロールを更新することです。Controlプロパティを変更しているので、Invokeを使用する必要があります。

public delegate void DataGridViewUpdate(object[,] data);

...

excel.InteractiveEdit( delegate(object[,] data) { 
    Invoke(new Common.DataGridViewUpdate(back_from_excel), new object[] { data }); 
});

...

private void back_from_excel(object[,] data) {
    // datagridview updating code
    // an exception is thrown here !
}

(このコードは私が更新しているFormクラスにあるので、Invoking onですthis

基本的に私の問題は、メソッドで例外が発生したときにback_from_excel(object[,] data)、デバッガーがそれをキャッチしないことです。フォームコントロールの操作に問題がないため、デリゲートが正しいUIスレッドで実行されていることはわかっています。

具体的にはback_from_excel、未処理の例外が発生すると、その時点で実行が停止します。アプリケーションの残りの部分は実行を継続し、応答します。デバッガーは一時停止しません。出力ペインには次のように表示されます。

A first chance exception of type 'System.NullReferenceException' occurred in My Application.exe
A first chance exception of type 'System.NullReferenceException' occurred in System.Windows.Forms.dll

.exeのどこかにあるというだけで、問題の原因となった行についてのヒントは得られません。

私の質問は:私はそのInvokeことを正しくやっていますか?デリゲート-Invoke-デリゲートがそのようにチェーンされているのはちょっと奇妙に思えますが、デリゲートを呼び出すデリゲートを渡す必要があります。私の問題はC#ではなくVisual Studioにありますか?その場合、デバッガーをそのUIスレッドに再接続するにはどうすればよいですか?

4

1 に答える 1

2

「最初のチャンスの例外」は、例外がスローされたが、ある時点でキャッチされたことを示します。デリゲートを InteractiveEdit メソッドに渡すため、そのメソッドはデリゲートによって生成された例外を簡単に飲み込むことができます。

既定では、Visual Studio はキャッチされない例外のみをキャッチします。キャッチされるかどうかに関係なく、すべての例外をキャッチする場合は、すべての例外で中断するように Visual Studio を構成する必要があります。これを行う方法の詳細については、このリンクを参照してください。

于 2011-08-04T21:10:15.937 に答える