[DllImport("ICRead.dll", EntryPoint = "IC_Read_SerialNO]
public static extern int IC_Read_SerialNO(
                                     [MarshalAs(UnmanagedType.LPStr)]  //用MarshalAs封装一下
                                      string aSerialNO);

解决方案 »

  1.   

    没用过Delphi 不知道
    function IC_Read_SerialNO(var aSerialNO: Pchar): Integer;
    中 Pchar是什么类型 还有 那个var干什么的
      

  2.   


    [DllImport("ICRead.dll", EntryPoint = "IC_Read_SerialNO]
    public static extern int IC_Read_SerialNO(StringBuilder aSerialNO)
      

  3.   

    用string一定不行(我先前没注意需要对字符串进行操作,string的内存不能修改)但也不能直接用stringbuilder,需要用marshalas封装,关键是知道那个PCHAR在内存中是怎么存储的
      

  4.   

    使用StringBuilder是可以的,至于乱码可能是用字符编码不一致引起的。
    你试试把C#接收到的数据转换成gb2312编码试试。
    以前的一个demo函数string GetStringA(string Value)
            {
                byte[] bData = Encoding.GetEncoding("gb2312") .GetBytes(Value);
                byte[] bDataresult = new byte[bData.Length];
                int i = 0;
                for (i = 0; i < bData.Length; i++)
                {
                    if (bData[i] == 0) break;
                    bDataresult[i] = bData[i];
                    //Result += Convert. .ToChar(bData[i]);
                }
                string Result = Encoding.GetEncoding("gb2312").GetString(bDataresult, 0, i);
                return Result;
            }
      

  5.   


    国标2312对ASCII低位英文是兼容的 从lz所列的函数名上看IC_Read_SerialNO应该是数字或英文之类的字符串 如果ASCII解码无异常 GB2312也应该不会有什么异常
    应该还是数据封装方面的问题 
    [DllImport("ICRead.dll", EntryPoint = "IC_Read_SerialNO]
    public static extern int IC_Read_SerialNO(
                                         [MarshalAs(UnmanagedType.LPWStr)]  //LZ再试试用LPWStr(Unicode编码)试试看
                                          string aSerialNO);
      

  6.   


    [DllImport("ICRead.dll", EntryPoint = "IC_Read_SerialNO, CharSet = CharSet.Ansi]
    public static extern int IC_Read_SerialNO(IntPtr aSerialNO);