处理来自c++ DLL - . net PInvoke/Marshalling的用户定义异常



我正在使用PInvoke内部调用C/c++ DLL的WPF应用程序。在DLL的调试模式下,每当发生错误时,函数抛出一个异常,该异常基本上是一个包含特定错误消息和特定于模块的应用程序代码的结构。这与普通的Win32错误日志记录不同。现在我的问题是我想捕获由DLL抛出的异常。

如果在Marshalled函数周围使用try catch, . net只是通知我在外部模块中发生了错误。

try
{
    // Marshalled function called
}
catch(Exception ex)
{
    MessageBox.show(ex.Message);
}

现在我明白C/C+= DLL异常不是从。net的异常类派生的类,因此。net将无法正确封送它。我不能将c++ DLL更改为托管DLL或对DLL代码进行任何源代码更改。

我确实在MSDN上看到了一个类似的帖子,用vc++提供了解决方案。.NET中,DLL的每个函数都被创建到一个包装器中,并抛出一个从。NET类派生的异常。

http://social.msdn.microsoft.com/forums/en us/csharpgeneral/thread/0624f3b3 - 5244 - 4 - cb8 be9c - 29 d464975d20

然而,这将需要另一个。net汇编项目,该项目将在vc++。net中创建大约200个函数和结构的包装器。现在,所有的DLL函数都已使用PInvoke导入到WPF应用程序中,因此任何现有场景的附加组件都是首选。

如果您想继续使用您在注释中指出的p/invoke,那么您唯一的选择是在DLL边界捕获异常。然后,您可以使用错误代码而不是异常将详细信息传递给托管应用程序。如果你想使用P/invoke,那么你就不能允许异常跨越DLL边界。

最新更新