2013-02-15 75 views
1

我正在加載一個dll,它自己產生了一些線程。時不時的程序崩潰與未處理的異常。我無法將所有庫調用都包含在try/catch語句中,因爲異常會在單獨的線程上拋出,並且我無法訪問庫的源以調試/修復錯誤的錯誤處理。我希望程序在發生這些異常時繼續做其他事情,是否有一種優雅的方式來處理這些異常?或者,我能做的唯一事情就是做一個全球性的捕獲所有異常的方法嗎?如何處理外部DLL中單獨線程上的異常?

+1

如果可行,如果在單獨的線程中有未處理的異常,則w3wp.exe不會崩潰。我的託管服務提供商已經發生好幾次了...... – leppie 2013-02-15 20:31:03

回答

1

如果您將DLL加載到單獨的應用程序域中,您應該能夠隔離由AppDomain.UnhandledException生成的異常,但請注意,這並非萬無一失,並且在某些情況下它仍會將您的過程排除並且你無能爲力(堆棧溢出,內存不足等)。

在這種情況下,你可以做的最好的做法是將它們加載到一個單獨的進程中,完全使用某種dll通信工具並使用某種形式的遠程處理來與該進程交談。

1

我會推薦實現一個單獨的進程(EXE),您的應用程序將啓動並依次加載該DLL。

這可以讓你殺/重新啓動時需要的過程......

我看到如何溝通的幾個選項 - 例如:

  • 你可以使用COM(如果你實現它作爲進程外,一個COM服務器)
  • 您可以使用共享內存(非常高的性能,看到this的演練和this對於.NET 2包裝)

如果該方法必須與多個Windows版本兼容,那麼我不會爲IPC使用任何「networky」(因爲有些附帶桌面防火牆)。