2012-05-25 122 views
3

因此,我們的應用程序有一個很好的中央異常處理程序,其中記錄異常的詳細信息,向用戶顯示通用窗口,並以優雅的方式進行關機。但是,我們現在有一個第三方組件,它不時(可能出於完全正確的原因)調用Environment.FailFast。這使我們的應用程序不受用戶的歡迎,而且對我們的用戶來說看起來相當糟糕。有沒有辦法以優雅的方式處理Environment.FailFast?有沒有辦法'處理'Environment.FailFast?

+5

這些問題是以老式的方式解決的。拿起電話並給他們打電話。解決這個問題,至少可以配置它,這樣它就不會再這樣做了。無休止地喜歡某種絕望的東西,比如在一個單獨的過程中運行它。 –

+0

@HansPassant不能+1那麼多! –

+0

第三方具有可用的源代碼;它似乎不直接調用Environment.FailFast ...而是...(http://stackoverflow.com/questions/10757164/under-what-c​​ircumstances-could-uielement-updatelayout-call-environment-failfas) – GWLlosa

回答

4

我看不到一個辦法,根據MSDN中的各種條目,這是一個很難終止的過程。您要創建的任何代碼都將駐留在此過程中。它也不會運行finally塊或任何掛起的終結器,所以我猜測不會提供任何事件或鉤子以允許自定義代碼運行。從某種意義上講,這種方法很有意義,否則它可能不會「快速」失敗,而且它只能用於極端過程腐敗的情況。

http://msdn.microsoft.com/en-us/library/dd289241

我看到三個選項:

  1. 傳送給供應商的要求更改代碼並刪除此調用。
  2. 尋找新的供應商。
  3. 正如@RB所建議的那樣。將這個DLL的使用放到一個新的進程中,這樣核心應用程序進程就會保持安全。我曾經這樣做過,頭痛很大,但是「有效」。 我只會建議這個,如果你不能利用建議1或2!從MSDN

引用:

該方法終止進程不運行任何活性 的try /最後塊或終結。

FailFast方法將消息字符串寫入Windows 應用程序事件日誌,創建應用程序的轉儲,然後 終止當前進程。消息字符串也包含在 錯誤報告給Microsoft。

使用FAILFAST方法,而不是退出方法來終止您 的應用程序,如果你的應用程序的狀態被損壞無法修復, 和執行應用程序的嘗試/ finally塊和終結 會破壞程序的資源。

+0

我的經驗是調用'Environment.FailFast()'會導致AppDomain。 CurrentDomain.UnhandledException'事件被同步調用。但是,這顯然不能用於避免海報試圖避免的不可避免的「醜陋」Windows對話框。我甚至試圖把一個'Process.GetCurrentProcess().Kill()'放到那個處理程序中,但我仍然得到了Windows消息。 –

+0

還有三種方法可以解決這個問題:①'FailFast'在內部調用一個可以掛鉤的Win32函數(雖然掛鉤需要用C++本地編寫); ②你可以創建自己的CLR主機,甚至不那麼難,它解決了@ DaveTillman的問題(你可以阻止對話); ③如果DLL未使用編織進行簽名,即使用[Fody](https://github.com/Fody/Fody) – Abel

2

您可以在新進程中執行第三方代碼。

這樣做的一種簡單方法是將第三方代碼包裝在可執行文件中,並使用Process.Start啓動該代碼。

請注意,我找不到文檔錯誤級別將在FailFast之後。當我測試它時,我得到的數值是-2146232797 ...

+0

,則可以刪除有問題的代碼當必須解決問題的唯一方法是從第三方供應商。它稍微不穩定,並且用於使整個過程崩潰。如果您無法找到替代供應商或解決方案,我會建議您這樣做 - 因爲如果您需要代碼相互交流,這也會使用進程間通信(或跨越流程邊界的其他一些機制)。我做到了這一點,特別頭痛,但是讓它工作。 –

+2

從.NET源代碼中,'-2146232797'是['COR_E_FAILFAST'](https://github.com/dotnet/coreclr/blob/6f3e349b80f713d902e0d47eac1948f6c6a4296d/src/pal/prebuilt/inc/corerror.h#L780),其中['Environment.FailFast'](https://github.com/dotnet/coreclr/blob/7045ca7a6de381b382a709dc0a61f49ca713d160/src/classlibnative/bcltype/system.cpp#L623)用作退出代碼。不是MSDN文檔,但至少有一些解釋價值。 – chwarr

相關問題