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
相关产品推荐
相关产品推荐

