سؤال

I'm currently trying to invoke a method made in C from C#

C code looks like this:

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

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

and C# code looks like this:

 [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();
 }

The code returns the right values but i'm getting the following error:

addSum' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

Any sugestion regarding this issue ?

Thanks

هل كانت مفيدة؟

المحلول

In addtion to the datatype which might or might not be a problem depending on the target platform, you might also need to look at the calling convention. It is the calling convention that determines amoung other thing who is responsible for the the stack clean-up and the order that arguments are pushed on the stack or assigned to registers etc.

It is common for C code to use the cdecl calling convention.

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

نصائح أخرى

You don't need to use IntPtr as argument. You could directly use integer values when defining the method signature:

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

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

And then directly invoke the function:

int result = SomeClass.addSum(3, 4);
int count = SomeClass.getCount();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top