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

Catching native C++ exceptions in C#

本文关键字:本机 C++ 异常      更新时间:2023-10-16

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

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

有没有替代解决方案来做到这一点,或者我只需要弄脏我的手......

你将不得不弄脏你的手,但你可以通过创建一个预处理器宏来封装所有重复的捕获逻辑来减少工作量。

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

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

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