本质是C#调用C++的非托管代码——似乎可以这么讲,
1,原型的定义,普通类型直接用即可,
1.1对于指针类型可以用ref 或者IntPtr,主要是考虑 用ref 可以直接使用该类型变量,但不能是0值,如果0值是有效、有意义的参数,则要考虑用IntPtr
用IntPtr可以直接指定该值为0,如果0/NULL值是有意义的,则是方便的,但IntPtr是一个无类型指针,与其他类型变量之间需要转换;
当参数是结构体时,1.1也适用。
2,如果想引用成功,则一定要与原参数一致,比如经常有指针参数不使用时,会被指定为0,这个往往是有意义的,如果用一个ref去代替,则会引起错误,所以参数值一定要严格一致(也许类型不一致可以,但最后翻译到数值上,一定要一致)
3,对于可变长度的结构体很难处理,比如 SP_DEVICE_INTERFACE_DETAIL,这种类型往往有一个可辨长度的指针,
4,cbSize不可以不注意,结构体中常用这个变量表示类型的sizeof值,也就是占用了内存的多少,但C#中的sizeof(即便是Marshal.Sizeof
)与C++中的sizeof不等同,特别是对于可变长度的结构体时,比如前面提到的SP_DEVICE_INTERFACE_DETAIL,这个时候要特别注意。如果错误则会照成结构错误。
5,unsafe,这个是最后的杀手级别的武器了,如果还不能解决,就可以使用这个,直接使用指针和定义的。当然在完毕之后转换成托管对象
6,另外,关于各种标志变量,可以用enum类型,也可以直接使用int等数值 ,看如何比较方便