本帖最后由 fendy5201 于 2014-03-01 15:36:12 编辑

解决方案 »

  1.   

    设备均可正常得到端口值,没有其他的异常,DLL的引用路径也是对的。
      

  2.   

            private static extern int SDT_ReadBaseMsg(int iPortID, StringBuilder pucCHMsg, ref int puiCHMsgLen, ...
    int puiCHMsgLen = 1024;
    StringBuilder pucCHMsg = new StringBuilder(puiCHMsgLen);
    int i = ReadBaseMsg(1001, pucCHMsg, ref puiCHMsgLen, ...
      

  3.   


    我都换成了StringBuilder,仍然是空的,获取不到值,不过谢谢啦!
      

  4.   

    你试试[DllImport("IdCardDLL/sdtapi.dll",CharSet = CharSet.Ansi)]
      

  5.   


    我已经这么写了,还是没有得到值。 [DllImport("IdCardDLL/sdtapi.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall, EntryPoint = "SDT_ReadBaseMsg")]
            private static extern int SDT_ReadBaseMsg(int iPortID, ref byte pucCHMsg, ref int puiCHMsgLen, ref byte pucPHMsg, ref int puiPHMsgLen, int iIfOpen);
            public unsafe static int ReadBaseMsg(int iPortID, ref byte pucCHMsg, ref int puiCHMsgLen, ref byte pucPHMsg, ref int puiPHMsgLen, int iIfOpen)
            {
                return SDT_ReadBaseMsg(iPortID, ref pucCHMsg, ref puiCHMsgLen, ref pucPHMsg, ref puiPHMsgLen, iIfOpen);
            }
      

  6.   

    debugview
    慢慢调试  看看dll里面能接受到不
    最好dll返回之前再输出下结果
      

  7.   

    [DllImport("IdCardDLL/sdtapi.dll", CharSet = CharSet.Ansi, EntryPoint = "SDT_ReadBaseMsg")]
            private static extern int SDT_ReadBaseMsg(int iPortID, StringBuilder pucCHMsg, ref int puiCHMsgLen, StringBuilder pucPHMsg, ref int puiPHMsgLen, int iIfOpen);
            public unsafe static int ReadBaseMsg(int iPortID, StringBuilder pucCHMsg, ref int puiCHMsgLen, StringBuilder pucPHMsg, ref int puiPHMsgLen, int iIfOpen)
            {
                return SDT_ReadBaseMsg(iPortID, pucCHMsg, ref puiCHMsgLen, pucPHMsg, ref puiPHMsgLen, iIfOpen);
            }
      

  8.   

    StringBuilder 改成string ,反正是参数不对
    个个的试
      

  9.   

    从 C# 中传递一个缓冲区到 DLL 中,用以获取数据时,需要进行托管内存与非托管内存之间的转换。
    1 char * 对应到 C# 为 IntPtr
    2 从托管内存到非托管内存的转换为:
    定义一个 byte[] buff,获取 IntPtr,
    GCHandle gc = GCHandle.Alloc(buff, GCHandleType.Pinned);
    IntPtr p = gc.AddrOfPinnedObject();
    2 从非托管内存到托管内存的转换为:
    Marshal.Copy(...) 系列方法其中一个