.net4.0呼叫非託管DLL的異常捕獲
阿新 • • 發佈:2019-02-17
由於有些非託管的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()時,如果發生非託管的異常,就會跑到異常處理塊中,剩下的事情就好辦了。