我有一个应用程序使用DLL来进行API调用。有没有办法来防止我的应用程序在DLL崩溃时崩溃?我试着在每次通话时都尝试一下,但这不起作用。捕获DLL崩溃
捕获DLL崩溃
回答
如果该DLL是第三方库,则无法修改,您可以加载并执行separate AppDomain中的代码。
如果是您自己的代码,最好先修复错误。 A NullReferenceException
几乎总是表示应修复代码中的错误。
由于您无法通过try/catch博客捕捉异常,因此我会假设异常发生在另一个线程上。可以将方法包装在try/catch块内的其他线程中,或使用AppDomain.UnhandledException事件来捕获它。
麻烦。重要的帮助在这里: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
@ Hans Passant:很棒的阅读,谢谢。澄清:我打算只有在无法修改DLL的情况下才使用AppDomain方法。 – 2010-08-27 21:29:30
它不是DLL崩溃,是你遭受心脏病发作的线索。它不能继续,这通常意味着你的过程也完成了。试图处理这个异常是很少可能的,你不知道造成了什么样的损害。
在单独的进程中运行它是唯一合理的解决方法。虽然试图从这个过程中恢复突然死亡是不合理的困难。
有某些条件总是会导致进程退出,例如StackOverflow in managed code,触摸防护页并且无法在任何进程上提交保留的堆栈页面(没有空间放置EXCEPTION_RECORD
)等。如果你想保护你的进程免受DLL造成的崩溃,你必须从不同的代理进程调用DLL。启动一个虚拟进程,仅用作DLL调用的主机,然后用IPC方式(共享内存,网络管道等)与此进程通信。如果进程崩溃,您将有办法检测它并据此进行操作。这比try/catch
复杂得多,但在C#中完全可行。了解你需要一个单独的应用程序作为你的碰撞测试假人过程。
如果不是引用DLL而是动态创建域并将DLL加载到域中,则可以保护您的应用程序。这并不容易,我发现DLL在运行时不会执行某些自己的方法,但如果可以的话,它将保护您的应用程序。但是这项工作可能并不值得。另一种方法可能是在调用方法之前尝试检测导致DLL错误的条件。
- 1. 捕获异常后崩溃
- 2. 在windows中捕获崩溃
- 3. 捕获崩溃日志
- 4. 如何在DLL中捕获应用程序崩溃
- 5. WPF d3d9.dll崩溃
- 6. 如何在应用程序崩溃时捕获崩溃
- 7. iPhone:AVCaptureSession捕获输出崩溃(AVCaptureVideoDataOutput)
- 8. UIDocumentInteractionController崩溃被异常断点捕获
- 9. AVCaptureSession捕获输出崩溃(AVCaptureVideoDataOutput)
- 10. 捕获ImageMagick的错误 - 节点崩溃
- 11. Bootstrap 4 Alpha - 崩溃 - 未捕获错误
- 12. 阅读PCAP捕获文件崩溃
- 13. 崩溃(没有被dispatcherunhandleception捕获,也没有被app.unhandledexception捕获)
- 14. 服务崩溃加载dll
- 15. 如何捕捉silverlight崩溃
- 16. 的Node.js的类型错误甚至崩溃,而捕获捕获的异常
- 17. Visual Studio崩溃,错误模块msvcr80.dll
- 18. 卸载DLL时计时相关崩溃?
- 19. DLL +升压+ VS2015 + WinXP的==崩溃
- 20. 接住一个DLL崩溃在C/C++
- 21. 防止第三方DLL崩溃PowerShell
- 22. 在VB崩溃问题的C++ DLL
- 23. Winforms崩溃没有qtcore4.dll胜7 7
- 24. .Net Windows Service与MSVCR120_CLR0400.dll异常崩溃
- 25. 当访问DLL时JNI崩溃
- 26. DLL错误/神秘的系统崩溃
- 27. C#应用崩溃使用C++/CLR DLL
- 28. C++ Dll字符串函数崩溃
- 29. 获取崩溃后DLL地址的函数
- 30. 捕捉应用程序崩溃事件
DLL是如何“崩溃”?抛出异常?堆栈溢出?空指针参考? DLL是托管代码还是非托管代码? – dthorpe 2010-08-27 19:37:48
并非所有的例外都可以被捕获。 DUN DUN DUNNNNNN! (不会有人想到孩子!) – 2010-08-27 19:39:47
DLL是托管代码,异常通常是空指针引用或字典关键错误。 – Robert 2010-08-27 19:53:16