C#用c++ DLL 闪退情况及原因分析
- 没错,我又来了 上一篇文章刚发完,又遇到了闪退
- 代码如下
Copy
char* (__stdcall * NationEcTrans)(char *strUrl,char *pindata,char *poutdata);
- 我们都知道按照基本映射关系表 char* 可以用StringBuilder、ref string 、byte[] 数组。而闪退的原因基本上为内存分配原因。最开始我这边没有注意 除了 char *poutdata 之外 其余均用了string。巧合的是测试环境下,回传的字符串字符不多。 .NET 4.0框架下可以使用 更高的框架下直接闪退。 此时我将返回值 改为IntPtr (句柄/指针)发现不再闪退。此时结束了吗? 当然没有 如果结束了就没有这篇文章了,上一篇已经改过了。 我们再次回到内存问题,关键点就在于StringBuilder、string 我们习惯了.NET 默认分配的内存。那内存溢出后 也会闪退。 所以最简单的方法是用byte数组 定义足够大的内存。传入 ref byte[0]。此时问题解决。
- 说到内存问题 我们都知道有GC机制。但GC回收不是在我们的可控范围内的。对于频繁拍照内存过大 GC来不及的时候也会闪退。此时我们可以利用以下代码 及时回收
Copy
GC.Collect();
GC.WaitForPendingFinalizers();
- 这个只是经验之谈,如有不对或者理解更透彻的欢迎交流沟通
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!