2017-02-17 18 views
2

P/Invoke呼び出しでネイティブAPIをラッピングしています。エラー処理の場合は、次のメソッドを使用します。P/Invokeで管理対象および非管理対象のコールバックチェーンで例外を発生させる

  • マネージコードからコールバック関数を呼び出します。
  • エラーを示すために、アンマネージコードからこのコールバック関数を呼び出します。
  • コールバックに例外をスローします。言い換えれば

の流れはこのようなものです:私は、このメソッドをテストするとき、私は最初の管理方法で成功した例外をキャッチすることができ

Managed Method => (P/Invoke) Unmanaged Function => Managed Callback => Throw Exception.

。しかし、私はこれがスタックやリークメモリに何らかの副作用を引き起こさないことを100%確信しているわけではありません。

この方法を使用しても安全ですか?そうでない場合は、P/Invokeを使用してAPIを乱雑にすることなく、エラー(スタックトレースを含む可能性があります)を示す他の方法がありますか?

P.S.私はネイティブコードにアクセスできます。

+0

管理対象コールバックの仕事は何ですか?それが存在する唯一の理由が管理例外を発生させることであるならば、マネージコールバックを必要とせずにC++/CLI interopアセンブリを書くことを検討するべきでしょう。 – IInspectable

+0

はい私はC++/CLIについて知っていますが、プロジェクトはP/Invokeアプローチで開始されており、既存の機能を変換するには多少の作業が必要です。 –

+0

P/Invokeを使用している場合は引き続きP/Invokeを使用し、新しいコードには混在モードのinteropアセンブリを使用できます。それにもかかわらず、それは私が尋ねた質問にはあまり答えなかった。 – IInspectable

答えて

1

短い回答:はい、安全です。一定の条件の下では

  • アンマネージ関数は(C++ことができますが、Cはできません)SEH例外を処理することができ、呼び出し元のことができるようにしなければならないので、
  • アンマネージ関数は、呼び出し元に例外を渡しますマネージド例外を理解して処理する(またはそれを上位に渡す)。

例:新しいスレッドを開始して新しいスレッドでマネージコールバックを呼び出すことはできません。コールバックによってスローされた例外は確実にアプリケーションを終了します。

+0

新しいスレッドとは、ネイティブスレッド、管理対象スレッド、またはその両方を意味しますか? –

+0

最初の条件には、Visual C++だけがこれをサポートすることも含める必要があると考えられます。 –

+0

C++とCの両方でSEH例外を処理できます。どちらも標準言語機能を提供していません。 C++コードをコンパイルしてコンパイラに非標準となるよう指示し、SEH例外(コンパイラスイッチ '/ EHa')も' catch(...) 'で処理しない限り、 – IInspectable

関連する問題