在C#中捕获本机C ++异常

Tar*_*ams 5 .net c# c++ exception

我有一些本机C ++类库,这些库已经包装在C ++ .NET中,然后从C#中调用(三层!)。

我可以从C ++ .NET抛出异常,并愉快地在C#中捕获它们。麻烦的是,我可以捕获本机C ++异常的唯一方法是捕获System.Exception,这很好,但是在从std :: exception到System.Exception的转换中,我丢失了有关错误的绝大多数信息(对于错误消息示例!)。我可以在C ++ .NET层中捕获本机异常,然后将其作为.NET异常重新抛出,但这是一种侵入式解决方案,需要我在每个C ++ .NET方法调用周围放置try-catch块(以捕获本机异常并重新抛出)。 。

是否有替代方法可以解决此问题,否则我将不得不弄脏我的手...

Ben*_*Ben 2

您将不得不亲自动手,但您可以通过创建预处理器宏来封装所有重复的 catch 逻辑,从而大大减少工作量。

我假设您想要捕获几种不同类型的异常,例如 MFC CException、std::Exception 以及 SEH 异常。

可能还想编写包装函数来返回 HRESULTS 并使用 SetErrorInfo(即转换为 COM 错误代码和错误信息) - 您可能会认为这为 .Net 提供了更清晰的接口,可以很好地将其转换为 .Net 异常。这将避免对 C++.Net 层的需要,并允许您使用 P/Invoke,并使其可从 VBA 调用。

或者你可能不会...只是指出这个选项!