DLL にコンパイルされた大量のネイティブ C++ コードがあります。
次に、C++ インターフェイスをラップする C++/CLI プロキシ コードを含む dll をいくつか用意します。
その上に、C++/CLI ラッパーを呼び出す C# コードがあります。
これまでのところ、標準的なもの。
しかし、ネイティブの C++ 例外が .Net の世界に伝播することが許可されているケースが多くあり、これらを System.Exception オブジェクトとしてラップする .Net の機能に依存しており、ほとんどの場合、これは正常に機能します。
ただし、スローの時点でスコープ内にあるオブジェクトのデストラクタが、例外が伝播したときに呼び出されていないことがわかっています。
いくつかの調査の結果、これはかなりよく知られている問題であることがわかりました。ただし、解決策/回避策は一貫性がないようです。ネイティブ コードを /EHsc ではなく /EHa でコンパイルすると、問題が解消されることがわかりました (少なくとも、テスト ケースでは解消されました)。ただし、SEH 例外を C++ 例外に変換するため、/EHsc を使用することを強くお勧めします。コンパイラに最適化の範囲を広げさせたいと考えています。
(C++/CLI レイヤーに加えて) (ネイティブ) try-catch-throw でネイティブ管理の境界を越えてすべての呼び出しをラップする以外に、この問題に対する他の回避策はありますか?