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