C#中Pinvoke的使用

最近在使用的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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值