2010-08-27 80 views
2

我有一个应用程序使用DL​​L来进行API调用。有没有办法来防止我的应用程序在DLL崩溃时崩溃?我试着在每次通话时都尝试一下,但这不起作用。捕获DLL崩溃

+2

DLL是如何“崩溃”?抛出异常?堆栈溢出?空指针参考? DLL是托管代码还是非托管代码? – dthorpe 2010-08-27 19:37:48

+1

并非所有的例外都可以被捕获。 DUN DUN DUNNNNNN! (不会有人想到孩子!) – 2010-08-27 19:39:47

+0

DLL是托管代码,异常通常是空指针引用或字典关键错误。 – Robert 2010-08-27 19:53:16

回答

3

如果该DLL是第三方库,则无法修改,您可以加载并执行separate AppDomain中的代码。

如果是您自己的代码,最好先修复错误。 A NullReferenceException几乎总是表示应修复代码中的错误。

由于您无法通过try/catch博客捕捉异常,因此我会假设异常发生在另一个线程上。可以将方法包装在try/catch块内的其他线程中,或使用AppDomain.UnhandledException事件来捕获它。

+0

麻烦。重要的帮助在这里:http://blogs.msdn.com/b/clraddins/archive/2007/05/01/using-appdomain-isolation-to-detect-add-in-failures-jesse-kaplan.aspx – 2010-08-27 21:08:17

+0

@ Hans Passant:很棒的阅读,谢谢。澄清:我打算只有在无法修改DLL的情况下才使用AppDomain方法。 – 2010-08-27 21:29:30

1

它不是DLL崩溃,是你遭受心脏病发作的线索。它不能继续,这通常意味着你的过程也完成了。试图处理这个异常是很少可能的,你不知道造成了什么样的损害。

在单独的进程中运行它是唯一合理的解决方法。虽然试图从这个过程中恢复突然死亡是不合理的困难。

1

有某些条件总是会导致进程退出,例如StackOverflow in managed code,触摸防护页并且无法在任何进程上提交保留的堆栈页面(没有空间放置EXCEPTION_RECORD)等。如果你想保护你的进程免受DLL造成的崩溃,你必须从不同的代理进程调用DLL。启动一个虚拟进程,仅用作DLL调用的主机,然后用IPC方式(共享内存,网络管道等)与此进程通信。如果进程崩溃,您将有办法检测它并据此进行操作。这比try/catch复杂得多,但在C#中完全可行。了解你需要一个单独的应用程序作为你的碰撞测试假人过程。

1

如果不是引用DLL而是动态创建域并将DLL加载到域中,则可以保护您的应用程序。这并不容易,我发现DLL在运行时不会执行某些自己的方法,但如果可以的话,它将保护您的应用程序。但是这项工作可能并不值得。另一种方法可能是在调用方法之前尝试检测导致DLL错误的条件。