C++ 與 .Net


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM