C# 在调用c代码生成的dll时,报错:对 PInvoke 函数“TestJBIG!TestJBIG.JbigHelper::jbigDecode”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。
处理方法:
确认c代码生成的dll的调用约定是和调用时一致的。
上图是vs里面生成C的dll的项目属性,里面的c/c++高级中调用约定需和c#在调用时的的设定一致,c#代码如下:
[DllImport("Jbig.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int test(byte[] endata, int enlen, ushort w, ushort h, byte[] data, ref int datalen);
这里我用的是Cdecl,其实都约定为用StdCall(标准方式)可能会更好。
捐赠:
BTC: 1NTom3PgUct3WNmnBYNq5KGDQvY3MXs8dJ
ETH:0x8509f0F37497e094924F5c2e776e0dA522c57e43
本文讨论了在C#中调用由c代码生成的dll时遇到的堆栈不对称错误问题,分析了可能的原因,并提供了确认并解决此问题的方法。
1万+

被折叠的 条评论
为什么被折叠?



