我有一个C ++ dll用于卡片打印(ID卡)。我的实现使用C#.Net完成。我使用以下代码来调用c ++ dll。
[DllImport(@"J230i.dll",CallingConvention = CallingConvention.Cdecl,SetLastError=true)]
public static extern int N_PrintJobStatus(ref int[] nPrtintjobStatus);
int[] pJob = {0,0,0,0,0,0,0,0} ;
ret = N_PrintJobStatus( ref pJob);
N_PrintJobStatus方法签名,如下所示
N_PrintJobStatus(int *pJobStatus )
调用方法后,它会出现以下错误
调用PInvoke函数'********!*********。frmCardPrint :: N_PrintJobStatus'使堆栈失衡。这很可能是因为托管PInvoke签名与非托管目标签名不匹配。检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。
如何解决此问题
谢谢.....答案 0 :(得分:3)
您的翻译不正确。一个int数组,int*
不会映射到ref int[]
。后者将被编组为int**
。您需要使用int[]
。
[DllImport(@"J230i.dll", CallingConvention = CallingConvention.Cdecl,
SetLastError = true)]
public static extern int N_PrintJobStatus(int[] nPrtintjobStatus);
在调用函数之前分配数组。大概你有办法确定它应该有多长。目前看来,这个函数看起来像是一个等待发生的缓冲区溢出。该函数如何知道数组有多长,所以采取措施避免写入超出其结束?
目前尚不清楚这是唯一的问题。我们无法确定返回类型是否为int
。或者调用约定是cdecl。或者该函数确实调用了SetLastError
。