Wir haben einen großen Bestand an nativem C++-Code, der in DLLs kompiliert ist.
Dann haben wir einige DLLs, die C++/CLI-Proxy-Code enthalten, um die C++-Schnittstellen zu umhüllen.
Hinzu kommt, dass wir C#-Code haben, der die C++/CLI-Wrapper aufruft.
So weit das Übliche.
Aber wir haben viele Fälle, in denen native C++-Ausnahmen in die .Net-Welt übertragen werden dürfen, und wir verlassen uns auf die Fähigkeit von .Net, diese als System.Exception-Objekte zu verpacken, was in den meisten Fällen gut funktioniert.
Wir haben jedoch festgestellt, dass die Destruktoren von Objekten, die sich zum Zeitpunkt des Wurfs im Anwendungsbereich befinden, nicht aufgerufen werden, wenn sich die Ausnahme ausbreitet!
Nach einigen Nachforschungen haben wir herausgefunden, dass dies ein ziemlich bekanntes Problem ist. Die Lösungen/Workarounds scheinen jedoch weniger einheitlich zu sein. Wir haben herausgefunden, dass das Problem verschwindet, wenn der native Code mit /EHa anstelle von /EHsc kompiliert wird (zumindest in unserem Testfall war es so). Wir würden es jedoch vorziehen, /EHsc zu verwenden, da wir selbst SEH-Ausnahmen in C++-Ausnahmen übersetzen und dem Compiler lieber mehr Spielraum für Optimierungen lassen würden.
Gibt es andere Workarounds für dieses Problem - andere als Wrapping jeden Aufruf über die native-verwaltete Grenze in einem (native) Try-Catch-Wurf (zusätzlich zu der C++/CLI-Schicht)?