Как передать unsigned long в общую библиотеку Linux с помощью P / Invoke - PullRequest
2 голосов
/ 18 ноября 2009

Я использую C # в Mono и пытаюсь использовать pinvoke для вызова разделяемой библиотеки Linux.

Вызов c # определяется как:

   [DllImport("libaiousb")]
   extern static ulong AIOUSB_Init();

Функция Linux определяется следующим образом:

  unsigned long AIOUSB_Init() {
       return(0);
  }

Команда компиляции для кода Linux:

gcc -ggdb -std=gnu99 -D_GNU_SOURCE -c -Wall -pthread -fPIC
      -I/usr/include/libusb-1.0  AIOUSB_Core.c -o AIOUSB_Core.dbg.o

Я могу вызвать функцию нормально, но возвращаемое значение - помешательство. Должно быть 0, но я получаю какое-то огромное искаженное число.

Я поместил printf в код Linux непосредственно перед возвратом значения функции, и это правильно.

Одна вещь, которую я заметил, немного странная, это то, что printf должен произойти до того, как функция вернется. Однако я вижу, что функция возвращает C #, а затем c # печатает возвращаемый результат, и, наконец, отображается результат printf.

Ответы [ 2 ]

1 голос
/ 18 ноября 2009

С здесь :

Длинный без знака может содержать все значения от 0 до ULONG_MAX включительно.ULONG_MAX должно быть не менее 4294967295.Длинные типы должны содержать как минимум 32 бита для хранения требуемого диапазона значений.

По этой причине C unsigned long обычно переводится в .NET UInt32:

[DllImport("libaiousb")]
extern static uint AIOUSB_Init();
1 голос
/ 18 ноября 2009

Вы, вероятно, используете это в системе, где C unsigned long 32-битный. C # без знака долго 64 бит. Если вы хотите убедиться, что возвращаемое значение имеет длину 64-битного знака без знака, включите stdint.h и верните uint64_t из AIOUSB_Init ().

...