我们有大量的本地 C++ 代码,编译成 DLL。
然后我们有几个包含 C++/CLI 代理代码的 dll 来包装 C++ 接口。
最重要的是,我们将 C# 代码调用到 C++/CLI 包装器中。
标准的东西,到目前为止。
但是我们有很多情况允许本地 C++ 异常传播到 .Net 世界,我们依靠 .Net 将它们包装为 System.Exception 对象的能力,并且在大多数情况下这工作正常。
然而,我们发现当异常传播时,抛出点范围内的对象的析构函数没有被调用!
经过一些研究,我们发现这是一个众所周知的问题。然而,解决方案/解决方法似乎不太一致。我们确实发现,如果使用 /EHa 而不是 /EHsc 编译本机代码,问题就会消失(至少在我们的测试用例中是这样)。然而,我们更喜欢使用 /EHsc,因为我们自己将 SEH 异常转换为 C++ 异常,并且我们宁愿让编译器有更多的优化空间。
这个问题还有其他解决方法吗 - 除了将每个调用都包装在(本机)try-catch-throw 中(除了 C++/CLI 层)之外?