C++函数:
short WINAPI RFID_REC_GetTagData(HANDLE hCom, UCHAR RAddr, 
UCHAR InTagCount, UCHAR *FinalGetTagCount, UCHAR *TagData,UCHAR *TagByteLen,UCHAR *AntNo, bool      
bNeedClr);转成C#:
  [DllImport(SDK_PATH,
      EntryPoint = "RFID_ISO_SearchUID", CharSet = CharSet.Auto, CallingConventionCallingConvention.StdCall)]
      public static extern 
       UInt16 RFID_REC_GetTagData(IntPtr hCom, UInt32 address,
       Int32 [color=#FF0000]TaG_Count_want_to_get
, ref Int32 Real_Get_Count, ref byte CardData, ref Int32 EveryTagLen,      bool  ant)[/color]TaG_Count_want_to_get 前不加 ref则报访问受保护内存错误,
加则对 PInvoke 函数“SRR_9151_DMOE!SRR_900X_SDK.SRR_900X_SDK_V13::RFID_REC_GetTagData”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。

解决方案 »

  1.   

    你把C++的生成dll现用C#调用不行吗
      

  2.   

    人家就是调用c++的DLLUCHAR 数据类型是对应int32吗?
      

  3.   

    UCHAR* --->> ref byte
      

  4.   

    UCHAR是byte
    把你的对应UCHAR的类型改成byte试试吧
      

  5.   

    UCHAR的类型改成byte也是一样的...
      

  6.   

    TaG_Count_want_to_get不加ref是对的,因为原先就是UCHAR。报访问受保护内存错误不是这里加不加ref的原因,而很可能是UCHAR *TagData这个参数,这个参数不能简单地翻译成ref byte,它是一块内存区域,用来放取到的数据的,至于怎么封送,还要看你原先的函数说明,这块区域由谁(调用方还是被调用方)来分配。
      

  7.   

    当我声明和调用处都只只有4个参数时
     RFID_REC_GetTagData(IntPtr hCom, UInt32 address,Int32 TaG_Count_want_to_get,
     ref Int32 Real_Get_Count)不涉及到TagData 也会有这样的错误啊...
      

  8.   

    要确定如何转换,必须知道UCHAR*的几个参数存储的数据究竟是什么类型(数组、字符串、字符指针?)的,还要知道调用时参数的输入、输出方向。当然,如果你使用IntPtr来获取这些指针参数的值应该是没有问题的,之后再用unsafe代码来分析具体的值。
      

  9.   

    你连基本的数据类型都没弄明白,出错是理所当然的c++的 UCHAR 对应 c#的 byte
    UCHAR* 对应 byte[]
      

  10.   

           #region 发送读卡命令
            //发送读单卡命令,读到卡后自动把卡号存入设备内部缓冲区
            //apiStatus WINAPI RFID_ISO_SearchUID(HANDLE hCom,UCHAR RAddr,UCHAR* TagCount);
            [DllImport(SDK_PATH,
           EntryPoint = "RFID_ISO_SearchUID", SetLastError = true,
             CharSet = CharSet.Unicode, ExactSpelling = true,
            CallingConvention = CallingConvention.StdCall)] 
            public static extern UInt16 RFID_ISO_SearchUID(IntPtr hCom, UInt32 address, ref byte  TaGCount);//传入串口句柄,输入,TaGCount为设备内部标签个数            #endregion
      

  11.   

    “原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。 ”
    函数类型定义与原型不符合short<>int16