У нас есть большая часть собственного кода C ++, скомпилированного в DLL.
Затем у нас есть пара dll, содержащих прокси-код C ++ / CLI для обертывания интерфейсов C ++.
Кроме того, у нас есть код C #, вызывающий оболочки C ++ / CLI.
Стандартные вещи, пока что.
Но у нас есть много случаев, когда собственные исключения C ++ могут распространяться в мире .Net, и мы полагаемся на способность .Net обернуть их в объекты System.Exception, и по большей части это работает нормально.
Однако мы обнаружили, что деструкторы объектов в области видимости в точке броска не вызываются при распространении исключения!
После некоторых исследований мы обнаружили, что это довольно известная проблема. Однако решения / обходные пути кажутся менее последовательными. Мы обнаружили, что если нативный код скомпилирован с / EHa вместо / EHsc, то проблема исчезнет (по крайней мере, в нашем тестовом примере это произошло). Однако мы бы предпочли использовать / EHsc, поскольку сами переводим исключения SEH в исключения C ++, и мы бы предпочли, чтобы компилятор имел больше возможностей для оптимизации.
Существуют ли другие обходные пути для этой проблемы - кроме переноса каждого вызова через нативно управляемую границу в (нативный) try-catch-throw (в дополнение к слою C ++ / CLI)?