1. 程式人生 > >.net4.0呼叫非託管DLL的異常捕獲

.net4.0呼叫非託管DLL的異常捕獲

由於有些非託管的DLL內部異常未有效處理,當託管程式呼叫到這樣的DLL時,就引起託管程式意外退出。

託管程式使用通常的捕獲try……catch塊不起作用。原因是.NET 4.0裡新的異常處理機制引起。

在4.0以前,因為SEH異常被轉換成了跟普通.NET異常相同的異常,這樣程式設計師只要用catch ( Exception e)的模式就可以捕捉到所有的異常。這樣處理的問題是,由於SEH異常通常都不是託管程式碼丟擲的,託管程式碼根本就不知道SHE異常被扔出來的原因,簡單的catch ( Exception e)處理使得整個程式會處於一個非常不穩定的狀態,使得前面被忽略的問題在後面以更嚴重的方式出現 — 例如儲存被破壞的資料。這樣,看起來使用catch ( Exception e)處理所有的異常的方法很簡單,但實際上讓程式設計師或者使用者在問題延後發生時,分析起來需要花費更多的精力。

在託管程式中捕獲非託管程式異常,需要在函式外面加一個HandleProcessCorruptedStateExceptions屬性,如下示例:

[HandleProcessCorruptedStateExceptions]
public static int GetInfo()

{

try{

        //產生非託管異常函式

        UnmanagedMethod();

}

catch(Exception ex)

{

//異常處理

}

}

這樣在呼叫自己寫的方法GetInfo()時,如果發生非託管的異常,就會跑到異常處理塊中,剩下的事情就好辦了。