捕獲C++的.dll拋出的異常html
C#調用C++動態庫以下,靜態加載方式api
[DllImport("FirmClient.dll", CallingConvention = CallingConvention.Winapi)] public extern static void Disp_Destroy(string inStr);
生產上遇到手機銀行驗籤,調用C++封裝的dll,若拋出的異常未捕獲,會致使應用程序直接崩掉退出。visual-studio
拋出 AccessViolationException 異常,提示: 因爲未經處理的異常,進程終止。編碼
緣由:.Net4.0中,C#默認只處理 SEH 的異常,不處理 CSE 的異常。spa
解決方法:屬性標識code
[HandleProcessCorruptedStateExceptions] [SecurityCritical] public void CheckCppDllException() { try { } catch(AccessViolationException avex) { ..loginfo } catch(Exception ex) { ..loginfo } }
關於 AccessViolationExceptionhtm
當嘗試讀或寫受保護的內存時會引起,向上冒泡到託管代碼的非託管代碼中的訪問衝突老是包裝在 AccessViolationException 中。blog
關於C#調用C++的問題總結,參見:http://www.javashuo.com/article/p-yytwnfos-eb.html進程
關於 Marshal.PtrToStringAnsi 中文亂碼ip
byte[] bytes = System.Text.Encoding.Unicode.GetBytes( Marshal.PtrToStringUni(audioOutput.psz_description)); //先轉成UNICODE編碼 string dec = System.Text.Encoding.UTF8.GetString(bytes); //再轉成UTF8