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);
原文地址:https://www.cnblogs.com/yao2yao4/p/3127599.html