c# - 我应该如何处理基于 C++ 的 dll 中的错误?

标签 c# c++ dll

我已经创建了一个 C++ DLL 并在 C# 应用程序中使用它。我应该如何报告错误?

使用异常并抛出我的错误,或者在std::coutstd::cerr 或其他什么地方打印它们?如果我在我的 DLL 中发出异常,我的 C# 应用程序是否能够捕获它?这方面的最佳行动方案是什么?

最佳答案

下面是 C# 的示例输出,使用 PInvoke 调用抛出 std::exception 的方法。

ex = System.Runtime.InteropServices.SEHException (0x80004005): 
 External component has thrown an exception.
   at ConsoleTester.Program.throw_exception()
   at ConsoleTester.Program.Main(String[] args) in ConsoleTester.cs:line 18

注意:在这种情况下,throw_exception() 是公开的 native 方法,它调用了一个子方法,但您看不到堆栈跟踪的那部分。对于最深的堆栈框架,您所获得的只是 native 边界。

因此,它并不完美,但确实有效。返回错误代码可能是处理此问题的最标准方法,但如果您是库的唯一使用者,它可能不会有太大区别。

注意:stdin/stdout 通常是最糟糕的错误处理方式。异常(exception)情况是编写一个自定义错误处理对象或一组例程,当出现问题时应用程序中的所有内容都可以访问,这并不是一件坏事。 (此类接口(interface)的输出有时可能是 stdin/stdout 或文件或配置时有用的任何内容)在这里考虑 log4j 或 log4net ...

通常,日志记录只是错误处理的一部分。您仍然需要向应用程序的其他部分发出信号以响应不利条件并(希望)从中恢复。在这里,只有错误代码或异常才能真正发挥作用(无论如何都要将异常从主程序流中减到最少)。

关于c# - 我应该如何处理基于 C++ 的 dll 中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17976187/

相关文章:

c++ - 转发声明一个标准容器?

android - OpenCV Android 坐标错误

c - 无法运行已编译的C+Gtk+-3软件

java - 使用 64 位 JDK 1.7.0 加载 64 位 dll

c# - 将字符串格式化为日期时间

c# - 如何访问网络中的 C$ 份额?

c++ - 当 C++ 线程退出时,内存是否保持分配状态?

c# - 在 EXCEL VBA 中使用 C# dll

c# - ASP.NET 客户端验证与服务器端验证

c# - 在 Monotouch 中绑定(bind) extern NSString