如何使用P / Invoke将unsigned long传递给Linux共享库

时间:2009-11-17 22:21:48

标签: c# mono pinvoke

我在Mono中使用C#,我正在尝试使用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

我可以调用函数ok,但返回的结果是bonkers。它应该是0,但我得到了一些巨大的数字。

我在返回函数值之前将printf放在Linux代码中并且它是正确的。

有一件事我注意到有点奇怪的是printf应该在函数返回之前发生。但是,我看到函数返回C#然后c#打印返回结果,最后显示printf结果。

2 个答案:

答案 0 :(得分:1)

您可能在C unsigned long 为32位的系统上运行它。 C#unsigned long是64位。如果要确保返回值是64位无符号长整数,请包含stdint.h并从AIOUSB_Init()返回uint64_t

答案 1 :(得分:1)

来自here

  

无符号长整数可以包含0ULONG_MAX之间的所有值。 ULONG_MAX必须至少4294967295。 long类型必须至少包含32位才能保存所需的值范围。

因此,C unsigned long通常会转换为.NET UInt32

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