我有一个使用DLL进行API调用的应用程序。有没有办法防止我的应用程序崩溃时崩溃?我尝试在每个调用周围放置一个try / catch,但这不起作用。
答案 0 :(得分:3)
如果DLL是第三方库,则无法修改,您可以在 separate AppDomain 中加载和执行代码。
如果是您自己的代码,最好先修复错误。 NullReferenceException
几乎总是表示代码中应该修复的错误。
由于您无法通过try / catch博客捕获异常,我会假设异常发生在另一个线程上。将方法包装在try / catch块中的另一个线程上,或使用AppDomain.UnhandledException事件来捕获它。
答案 1 :(得分:1)
不是崩溃的DLL,它是你的心脏病发作的线程。它无法继续,这通常意味着您的流程也已完成。试图处理异常很少,你不知道造成了什么样的损害。
在单独的流程中运行它是唯一合理的解决方法。虽然试图从这个过程中恢复突然死亡是不合理的努力。
答案 2 :(得分:1)
某些条件总会导致进程退出,例如StackOverflow in managed code,触摸防护页面并且无法在任何进程上提交保留的堆栈页面(没有空间放置EXCEPTION_RECORD
)和其他一些。如果要保护进程免受DLL导致的崩溃,则必须从其他代理进程调用DLL。启动一个虚拟进程,仅作为DLL调用的主机,然后使用IPC方式(共享内存,网络管道等)与此进程通信。如果进程崩溃,您将有办法检测它并相应地继续。这比try/catch
更复杂,但在C#中完全可行。了解您需要单独的应用程序作为崩溃测试虚拟过程。
答案 3 :(得分:1)
如果不是引用DLL而是动态创建域并将DLL加载到其中,则可以保护应用程序。这并不容易,我发现在运行时不会执行某些自己的方法的DLL,但是如果你能做的话它会保护你的应用程序。尽管如此,努力可能还不值得。另一种方法可能是在调用方法之前尝试检测导致DLL错误的条件。