• 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等数值 ,看如何比较方便


  • 相关阅读:
    Oracle 查看表空间的大小及使用情况sql语句
    Oracle审计--AUD$占用空间较大处理方案
    system表空间爆满解决方法
    Oracle查询库中记录数大于2千万的所有表
    oracle 百万行数据优化查询
    React (Native) Rendering Lifecycle
    React于React native的渲染机制
    Virtual DOM的渲染机制--猜测
    react的优点:兼容了dsl语法与UI的组件化管理
    What is Babel?---JSX and React
  • 原文地址:https://www.cnblogs.com/kevinzhwl/p/1812449.html
Copyright © 2020-2023  润新知