2013-07-31 47 views
1

我已经创建了一个C++ DLL,并且正在C#应用程序中使用它。我应该如何报告错误?
使用异常和throw我的错误,或打印他们在std :: cout或std :: cerr,或其他?如果我在DLL中发出异常,我的C#应用​​程序是否能够捕获它?
什么是这方面的最佳行动方案?我应该如何处理基于C++的dll中的错误?

+1

“C++ dll”是什么意思?你是否使用'extern'或类似的方式公开本地类?通常DLL应该是“C DLL”(可能用C++编写)或“COM DLL”或“托管装配”。创建直接公开本机C++对象的DLL通常是一个坏主意,因为如果没有生成它的确切编译器版本,很难链接。 – 2013-07-31 16:48:07

+0

答案很大程度上取决于您的C++代码是否管理。 –

+0

是的,我使用了extern C,而我的C++没有管理。 – Breeze

回答

1

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

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()是暴露的本地方法,并将其称为子方法,但你不能看到堆栈跟踪的一部分。所有你得到最深的堆栈帧是本地边界。

所以,它不是完美的,但它确实有效。返回错误代码可能是处理这个问题的最为标准的方式,但如果您是该库的唯一使用者,则可能不会有太大的区别。

注意:stdin/stdout通常是处理错误的最糟糕的方法。例外情况是编写自定义错误处理对象或一组例程以避免出现错误时应用程序中的所有内容都可以访问。 (这种接口的输出有时可能是标准输入/标准输出或文件或任何有用的配置)认为log4j或log4net在这里...

通常,日志记录只是错误处理的一部分。您仍然需要向应用程序的其他部分发出信号,以对不利条件做出反应并(希望)从其中恢复。在这里,只有错误代码或异常真的起作用(并且反正主程序流程中的异常会被最小化)。

1

请勿在stdoutstderr上打印错误!您需要以编程方式返回错误,以便C#应用程序有机会处理它们。如果主机应用程序是一个GUI应用程序呢?

从C++ DLL中抛出异常充满了危险。即使您的应用程序是C++,也必须使用与DLL完全相同的编译器进行编译,如@ebyrob所述。从C#调用,我不确定。

最佳的操作过程是返回错误代码。

1

这真的取决于错误的强度。我见过的大多数库都会从其函数调用中返回成功或失败结果值,您可以在代码中使用它时手动检查结果值。他们通常会提供另一种方法,只是在您想要查看时才检索错误消息。

为真正的大事保留抛出异常,你不能继续没有,这将迫使人们使用你的库来修复这些错误(或者至少,看到有一个大问题)。

我不会推荐在控制台窗口中打印任何东西,这是一个非常缓慢的操作,并且在那里强制任何人使用你的库来获得这些开销,而没有什么优化选择。如果他们想打印错误消息,他们可以从库中检索错误数据并将它们自行打印出来。

相关问题