Проблема вызова C DLL в C # - PullRequest
       12

Проблема вызова C DLL в C #

2 голосов
/ 08 января 2011

Я сейчас пытаюсь вызвать метод, созданный в 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 ]

4 голосов
/ 08 января 2011

В дополнение к типу данных, который может или не может быть проблемой в зависимости от целевой платформы, вам также может понадобиться взглянуть на соглашение о вызовах. Это соглашение о вызовах, которое определяет среди прочего, кто отвечает за очистку стека и порядок, в котором аргументы помещаются в стек или присваиваются регистрам и т. Д.

Обычно в коде C используется cdecl соглашение о вызовах.

[DllImport("mydll.dll", 
           SetLastError=true, 
           CallingConvention=CallingConvention.Cdecl)]
4 голосов
/ 08 января 2011

Вам не нужно использовать 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();
...