You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#调用C++ DLL的init函数出现PInvoke栈不平衡问题排查

问题分析与修正

核心错误点

  • 调用约定不匹配:C++导出函数使用的是_stdcall调用约定(栈由被调用方负责清理),但C#的DllImport中指定的是CallingConvention.Cdecl(栈由调用方负责清理),这是导致栈不平衡异常的直接原因。
  • 参数类型不匹配:C的第二个参数是const char*(只读输入字符串),C#却误用了StringBuilder——StringBuilder仅适用于对应C中可修改的char*输出参数,只读输入参数应使用string类型。

修正后的C#函数声明

[DllImport("mydll.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public static extern int init(StringBuilder buff, string aData);

调用代码调整

第二个参数直接传入读取的字符串即可,无需包装为StringBuilder:

StringBuilder sResult = new StringBuilder(1024);
last_res = DllApi.init(sResult, File.ReadAllText("aaaaaaa"));

内容的提问来源于stack exchange,提问作者vico

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 18:33:09