C#:将int数组传递给c ++ dll

时间:2014-11-20 09:18:54

标签: c# c++ .net pinvoke dllimport

我有一个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签名的调用约定和参数是否与目标非托管签名匹配。

如何解决此问题

谢谢.....

1 个答案:

答案 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