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