C++ 与 .Net

博客主要讲述C#调用C++动态库时的异常捕获问题。生产中手机银行验签调用C++封装的dll,若异常未捕获会致应用程序崩溃。原因是.Net4.0中C#默认只处理SEH异常,不处理CSE异常,还提及相关异常及中文乱码问题的参考链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

转载于:https://www.cnblogs.com/wjcx-sqh/p/10827932.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值