天天看點

.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()時,如果發生非托管的異常,就會跑到異常處理塊中,剩下的事情就好辦了。

參考文章:http://www.cnblogs.com/Terry-greener/archive/2011/11/29/2268052.html

繼續閱讀