P/Invokes初看起来非常简单,利用DllImport进行extern函数的声明,程序就可以在调用extern函数的时候自动查询调用到对应的非托管函数,有些类似Java的native函数,但更为简单,不需要编写相应的C函数导出。例如
[DllImport(LIB, CallingConvention = CallingConvention.Cdecl)]
public static extern void testfunc();
简单的P/Invokes封装可以把C库头文件的函数全部复制过来,并按照如下规则进行修改(可以通过正则表达式查找替换搞定):
- C#的基元类型都可以在C里面找到对应的类型(decimal和object除外,size_t需要特别注意,要用IntPtr对应)
- 参数和返回值里面的字符串可以替换成string;
- 参数里面的char *或const char *等之类的内存块数据可以替换成byte[];
- 参数和返回值里面的函数指针可以先声明参数和返回值类型兼容的delegate,然后替换成delegate;
- 其他指针类型可以替换成IntPtr;
- ...不定长度参数的函数和va_list参数的函数没找到如何映射的,最终只能放弃导入自己用C#实现;
- 传递类/结构值而非指针的函数不知道如何声明,暂时没有这个需求。
时间: 2024-11-06 01:55:49