在C#中调用C DLL的问题

时间:2011-01-08 09:43:59

标签: c# c dllexport

我目前正在尝试从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签名的调用约定和参数是否与目标非托管签名匹配。

关于这个问题的任何消息?

由于

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:4)

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

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

[DllImport("mydll.dll", 
           SetLastError=true, 
           CallingConvention=CallingConvention.Cdecl)]