7

C ++ .NETでラップしたネイティブC++クラスライブラリがいくつかあり、それをC#(3層!)から呼び出します。

C ++ .NETから例外をスローし、C#でそれらをうまくキャッチできます。問題は、ネイティブC ++例外をキャッチする唯一の方法は、System.Exceptionをキャッチすることです。これは問題ありませんが、std :: exceptionからSystem.Exceptionへの変換では、エラーに関する情報の大部分が失われます(エラーメッセージの例!)。C ++ .NETレイヤーでネイティブ例外をキャッチし、.NET例外として再スローできますが、これは、すべてのC ++ .NETメソッド呼び出しの周りにtry-catchブロック(ネイティブ例外をキャッチして再スローするため)を配置する必要がある煩わしいソリューションです。 。

これを行うための代替の解決策はありますか、それとも私は手を汚さなければならないだけですか...

4

1 に答える 1

2

手を汚す必要がありますが、繰り返されるすべてのキャッチ ロジックをカプセル化するプリプロセッサ マクロを作成することで、作業を大幅に減らすことができます。

MFC CException、std::exception、SEH 例外など、いくつかの異なる種類の例外をキャッチする必要があると想定しています。

HRESULTS を返し、SetErrorInfo を使用する (つまり、COM エラー コードとエラー情報に変換する) ラッパー関数を作成することもできます。これにより、これを .Net 例外に適切に変換できる .Net へのよりクリーンなインターフェイスが得られると判断する場合があります。これにより、C++.Net レイヤーが不要になり、P/Invoke を使用できるようになり、VBA から呼び出し可能になります。

または、そうではないかもしれません... オプションを指摘するだけです!

于 2012-08-14T09:10:24.373 に答える