5

Marshal::GetFunctionPointerForDelegate によって提供される関数ポインターを介してマネージド デリゲートを呼び出すアンマネージド C++ があります。このデリゲートは、例外をスローする可能性があります。アンマネージ C++ でこの例外を適切に処理して、ポインターのクリーンアップなどを確実に行い、例外をより多くのマネージ コードに再スローできるようにする必要があります。コール スタックは次のようになります。

マネージド コード -> アンマネージド C++ -> デリゲートを介したマネージド コードへのコールバック (ここで例外をスローできます)。

アンマネージ コード内のリソースをクリーンアップし、コール スタック全体を開始したマネージ コードに使用可能な例外をスローできるように、この状況を適切に処理するためのポインタを持っている人はいますか?

4

5 に答える 5

2

マネージド コードからのキャッチ

try
{
  throw gcnew InvalidOperationException();
}
catch(InvalidOperationException^ e)
{
  // Process e
  throw;
}

[assembly:RuntimeCompatibility(WrapNonExceptionThrows = true)];

アセンブリで、マネージ例外とアンマネージ例外をキャッチします

于 2008-10-08T14:59:51.643 に答える
1

「管理されていない」コードに、.NET を処理する必要があるという事実をリモートで認識させようとしないでください。

コールバックからゼロ以外の値を返して、エラーの存在を知らせます。ユーザーに役立つエラー メッセージを取得できるように、エラーを説明する (スレッド ローカルの) グローバル文字列オブジェクトを提供します。

これには、デリゲートを舞台裏の別の関数にラップすることが含まれる場合があります。これにより、すべての例外がキャッチされ、エラー コードが返されます。

于 2011-06-10T17:32:53.217 に答える
0

マネージ コードは、C++ とは異なり、例外をハードウェア例外として表します。SEHを使用できます。例外フィルターを実行する機会は常にあることに注意してください。

http://msdn.microsoft.com/en-us/library/ms680657(v=VS.85).aspx

于 2011-06-10T17:38:03.167 に答える
0

1 つのアプローチは、SEH を使用し、例外の伝播を続行する前に例外フィルターでクリーンアップを行うことです。しかし、フィルターで多くの作業を行うことになるため、それが過度に合法であるかどうかはわかりません。また、伝播されているマネージ例外についても何も知りません。

別の方法として、マネージド デリゲートを独自のマネージド関数でラップして例外をキャッチし、次にアンマネージド例外をスローすることもできます。これをアンマネージド コードでキャッチできます。

アンマネージ コードのクリーンアップが完了したら、別のヘルパー マネージ関数を使用して、元のマネージ例外を再スローします。

于 2008-10-08T15:08:51.440 に答える