c# - 在 C# 中捕获 native C++ 异常

标签 c# c++ .net exception

我有一些 native C++ 类库,我用 C++ .NET 封装了它们,然后我从 C# 调用它们(三层!)。

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

是否有替代解决方案来执行此操作,还是我将不得不亲自动手......

最佳答案

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

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

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

或者您可能不会...只是指出选项!

关于c# - 在 C# 中捕获 native C++ 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11948651/

相关文章:

c# - 如何更新数据表的单元格值?

c# - 检查值元组是否为默认值

c++ - LPCTSTR 与 StringCchCat 的连接

C++ 选择排序( vector )

.net - 如何在我的 Html Helper 中调用 RenderAction?

.net - 如果我有一个返回不同列表的方法,我应该让它返回 ISet<T> 而不是 IEnumerable<T>

排序 GridView 时 C# 无限循环

c# - 在 C# 中,List<struct> 中的值是否已装箱?

.net - NLog:记录序列化为 JSON 的对象

c++ - mapreduce c 编程无法与 -fPIC 链接,如何解决?