Exception handling 处理来自C+的用户定义异常+;DLL-.NET PInvoke/编组

Exception handling 处理来自C+的用户定义异常+;DLL-.NET PInvoke/编组,exception-handling,pinvoke,marshalling,Exception Handling,Pinvoke,Marshalling,我正在开发WPF应用程序,它使用PInvoke在内部调用C/C++DLL。在DLL的调试模式中,每当发生错误时,函数都会抛出一个异常,该异常基本上是一个定义的结构,包含特定于模块的特定错误消息和应用程序代码。这与正常的Win32错误日志记录不同。现在我的问题是我想捕获DLL引发的异常 如果正在使用封送函数的try-catch,.NET刚刚通知我说外部模块中发生了错误 try { // Marshalled function called } catch(Exception ex) {

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

如果正在使用封送函数的try-catch,.NET刚刚通知我说外部模块中发生了错误

try
{
    // Marshalled function called
}
catch(Exception ex)
{
    MessageBox.show(ex.Message);
}
现在我知道C/C+=DLL异常不是从.NET异常类派生的类,因此.NET将无法正确封送它。我不能将C++ DLL更改为托管的,或者对DLL代码进行任何源代码更改。 我确实在MSDN上看到了一篇类似的文章,其中包含VC++.NET中提供的解决方案,其中DLL的每个函数都被创建到一个包装器中,该包装器抛出一个从.NET类派生的异常


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

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

如果要按照注释中的指示继续使用P/invoke,则只能在DLL边界捕获异常。然后,可以使用错误代码而不是异常将详细信息传递给托管应用程序。如果要使用P/invoke,则不能允许异常跨越DLL边界。

使用pinvoke是错误的开始方式。你必须创建C++ +CLI包装来捕捉C++异常。除了重写整个DLL API,从零开始,还有什么可以做的吗?我在MSDN论坛上提到的帖子有你的解决方案,但在VC.NET中,有没有办法在C#.NET中创建这样的包装器?可能重复:@yms:正如我在问题中提到的,返回的错误代码不是Win32标准错误,可以映射,因此Win32 Exception没有帮助。但我确实试过了,但并没有给我想要的结果。Hans Passant已经通过创建一个管理的C++包装器在MSDN论坛上给出了一个类似的问题的解决方案。但是,目前由于约束,我没有选择这个选项。K Singh,我实际上在思考这个答案:使用P援克是错误的开始方法。你必须创建C++ +CLI包装来捕捉C++异常。除了重写整个DLL API,从零开始,还有什么可以做的吗?我在MSDN论坛上提到的帖子有你的解决方案,但在VC.NET中,有没有办法在C#.NET中创建这样的包装器?可能重复:@yms:正如我在问题中提到的,返回的错误代码不是Win32标准错误,可以映射,因此Win32 Exception没有帮助。但我确实试过了,但并没有给我想要的结果。Hans Passant已经通过创建一个管理的C++包装器在MSDN论坛上给出了一个类似的问题的解决方案,但是目前我没有选择来限制它的运行。K Singh,我实际上在思考这个答案: