C#中Pinvoke的使用

本文探讨了通过PInvoke方式让C#应用调用C++非托管代码访问USB设备的具体方法,包括指针类型处理、结构体传递注意事项、可变长度结构体处理策略及安全指针使用等内容。
最近在使用的pinvoke的方式访问USB,
本质是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等数值 ,看如何比较方便


转载于:https://www.cnblogs.com/kevinzhwl/archive/2010/08/30/1812449.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值