C#用c++ DLL 閃退情況及原因分析
- 沒錯,我又來了 上一篇文章剛發完,又遇到了閃退
- 代碼如下
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來不及的時候也會閃退。此時我們可以利用以下代碼 及時回收
GC.Collect();
GC.WaitForPendingFinalizers();
- 這個只是經驗之談,如有不對或者理解更透徹的歡迎交流溝通