防止本机C ++ DLL崩溃C#App

时间:2018-03-08 00:32:13

标签: c# c++

我们有一个c#WPF应用程序,我们使用带有本机C ++ DLL的第三方SDK,我们使用DllImport属性调用这些方法。

不幸的是,代码并不是很好,C ++ DLL会崩溃我们的C#app。

是否有一种优雅而有效的方法来隔离对C ++ DLL的调用,以便它们的异常不会使我们的应用程序崩溃?我们正在获得图像和数据流,因此需要快速。

我们使用WCF来卸载Windows服务中的某些操作,因此我们有一个基础设施来执行此操作,但我认为它不足以快速传输数据和图像缓冲区。

不同的AppDomain会是一个不错的选择吗?任何例子如何做到这一点?

感谢

4 个答案:

答案 0 :(得分:0)

在这种情况下终止应用程序可能是正确的行为。如果您可以控制 DLL ,我会考虑以不同方式处理其异常

从记忆中,我相信(在早期版本的.Net中)你可以通过ExternalException课程catch

注意 :.NET v4及更高版本默认情况下禁用某些例外的传递

为了重新启用这个我相信'您可以只编辑清单或使用属性,看看

legacyCorruptedStateExceptionsPolicy Element

HandleProcessCorruptedStateExceptionsAttribute Class

答案 1 :(得分:0)

不久前发生了类似的崩溃。我想首先应该恢复原生dll错误。您无法使用从本机代码中捕获异常。

答案 2 :(得分:0)

确保C ++ DLL不会导致C#进程崩溃的唯一方法是将其移动到另一个进程,如果它崩溃可以重新启动。

您可以将C ++ DLL包装在单独的应用程序/服务中,并通过命名管道与C#应用程序通信以传输图像数据。您还需要某种心跳来检测包装器是否崩溃并根据需要重新启动它。

我们为显微镜实现了这个解决方案,该显微镜带有一个不断崩溃我们的应用程序的ActiveX组件。这种方法效果很好,而且速度很快。

答案 3 :(得分:0)

AppDomains不为本机程序集提供隔离,因为它们使用非托管内存,因此我不确定辅助应用程序域中的访问冲突是否会导致整个过程失效。

我猜你的问题是由于国家腐败造成的。因此,在尝试外接服务之前,您可以尝试捕获这些例外。

How to handle AccessViolationException

只要图书馆本身可以恢复,你就可以了。值得一试。