2

我目前正在尝试从 C# 调用 C 中的方法

C 代码如下所示:

extern "C"  int addSum(int a, int b)
{
    return a*b;
}

extern "C" int getCount()
{
    return 12;
}

和 C# 代码如下所示:

 [DllImport("mydll.dll", SetLastError=true)]
 private static extern int addSum(IntPtr a, IntPtr b);
 [DllImport("mydll.dll", SetLastError = true)]
 private static extern int getCount();

 public static int mySum(int a, int b)
 {
     return suma(a, b);
 }

 public static int getMyCount()
 {
     return getCount();
 }

该代码返回正确的值,但我收到以下错误:

addSum' 使堆栈不平衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。

关于这个问题有什么建议吗?

谢谢

4

2 回答 2

4

您不需要使用 IntPtr 作为参数。您可以在定义方法签名时直接使用整数值:

[DllImport("mydll.dll", SetLastError = true)]
public static extern int addSum(int a, int b);

[DllImport("mydll.dll", SetLastError = true)]
public static extern int getCount();

然后直接调用函数:

int result = SomeClass.addSum(3, 4);
int count = SomeClass.getCount();
于 2011-01-08T09:48:14.890 回答
4

除了根据目标平台可能会或可能不会出现问题的数据类型之外,您可能还需要查看调用约定。调用约定决定了谁负责堆栈清理以及参数被压入堆栈或分配给寄存器等的顺序。

C 代码通常使用cdecl调用约定。

[DllImport("mydll.dll", 
           SetLastError=true, 
           CallingConvention=CallingConvention.Cdecl)]
于 2011-01-08T10:01:15.293 回答