我在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结果。
答案 0 :(得分:1)
您可能在C unsigned long 为32位的系统上运行它。 C#unsigned long是64位。如果要确保返回值是64位无符号长整数,请包含stdint.h
并从AIOUSB_Init()返回uint64_t
。
答案 1 :(得分:1)
来自here:
无符号长整数可以包含
0
和ULONG_MAX
之间的所有值。ULONG_MAX
必须至少4294967295
。 long类型必须至少包含32位才能保存所需的值范围。
因此,C unsigned long
通常会转换为.NET UInt32
:
[DllImport("libaiousb")]
extern static uint AIOUSB_Init();