C#平台调用的步骤
1、准备CLRInsideOut2008_01.exe程序
2、将所有的C的函数、结构、常量的声明合并到一个文件中
3、去掉所有的预编译指令、头文件导入声明
4、去掉定义为函数的宏
5、用上述的程序转换它,仔细查看第一个错误,修正它
6、复制到C#类库中,整理一下
7、明确函数导入的dll名称
8、为函数添加调用约定
9、为委托添加调用约定
形式:[UnmagedFunctionPointer(CallingConvention.Cdecl)]
10、以“Error”为关键字查找,解决一下
11、平台调用以函数为中心,对无用的结构、委托、常量、枚举,可以删掉
12、仔细过一遍,查找不合理的地方
13、char*变为StringBuilder而不是IntPtr;
BOOL变bool而不是int,增加[return:MarshalAs(UnmanagedType.Bool)];
unsigned char*变IntPtr而不是string。
14、重命名匿名成员
15、结构体太复杂或太大的解决方案
void F(ref A a) { }
声明变为:
void F(IntPtr a) { }
如果指针只是取数据:
var intPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(A))); F(intPtr); var w = (A)Marshal.PtrToStructure(intPtr, typeof(A));
如果指针只是送数据:
var intPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(A))); A aa; Marshal.StructureToPtr(aa, intPtr, true); F(intPtr);