C++ 與 .Net

捕獲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

具體參見:http://www.javashuo.com/article/p-clepdoal-dt.html

相關文章
相關標籤/搜索