zoukankan      html  css  js  c++  java
  • 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等数值 ,看如何比较方便


  • 相关阅读:
    [bzoj1113][Poi2008]海报PLA
    [CF1111D]Destroy the Colony
    [CF1111E]Tree
    [CF1111C]Creative Snap
    [洛谷P5136]sequence
    [洛谷P5190][COCI 2010] PROGRAM
    [洛谷P5137]polynomial
    US Open 2016 Contest
    【hackerrank】Week of Code 26
    usaco中遇到的问题
  • 原文地址:https://www.cnblogs.com/kevinzhwl/p/1812449.html
Copyright © 2011-2022 走看看