すのはら荘春原庄的雪

c# 引用c++ DLL 闪退

Toretto·2022-02-23 17:40·1280 次阅读

c# 引用c++ DLL 闪退

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();
  • 这个只是经验之谈,如有不对或者理解更透彻的欢迎交流沟通
posted @   すのはら荘の雪  阅读(1280)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示