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錯誤的條件。