//********************************************************
#define EFMI_POINTNAMELENGTH 48
//结构
typedef struct defefSTReadRtInfoRequest{
long time;
char pointName[EFMI_POINTNAMELENGTH+1];
     
char ednaServ[EFMI_POINTCOMMLENGTH+1];
}efSTReadRtInfoRequest;//****************************************************************//****************************************************************
typedef struct defefSTReadRtResponse{

double value;
long time;
unsigned short status;/////////////////////////////////////////
char pointName[EFMI_POINTNAMELENGTH+1];//点名,扩展ID
}efSTReadRtInfoResponse;函数:
BOOL  effnEDClientCheckPointInfoByTimeEx(
efSTReadRtInfoRequest*pReqBuffer,
efSTReadRtInfoResponse * pResBuffer,
unsigned long Count 
);获取实时数据。
//c#调用
    [StructLayout(LayoutKind.Sequential)] 
    public  struct defefSTReadRtInfoRequest
    {
     public  long time;
   
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 49)]
     public  char[] pointName;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 48)]
        public char[] ednaServ;   
    }//****************************************************************//****************************************************************
    [StructLayout(LayoutKind.Sequential)] 
 public struct defefSTReadRtResponse{
     public double value;
     public long time;
     public UInt16 status;
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 48)]
     public char[] pointName;//
   
};//函数 [DllImport("efEDClient.dll", EntryPoint = "effnEDClientCheckPointInfoByTimeEx", CharSet = CharSet.Unicode)]
        public static extern bool effnEDClientCheckPointInfoByTimeEx(ref defefSTReadRtInfoRequest requestBuffer,out defefSTReadRtResponse responseBuffer,[MarshalAs(UnmanagedType.Error)]UInt32 count);//调用defefSTReadRtInfoRequest req=new defefSTReadRtInfoRequest();
         char[] arrP = new char[49];
         char[] arrServ = new char[48];         arrP = "GDHYSSIS.U31_RTS.1EHC:C47.RO01".ToCharArray();
         arrServ = "mlz.pushserv".ToCharArray();
         req.pointName = arrP;
         //MessageBox.Show(req.pointName.Length.ToString());
         req.time = 3;
         req.ednaServ = arrServ;
        // req.
      
         defefSTReadRtResponse resp;
 effnEDClientCheckPointInfoByTimeEx(ref req, out resp, nCount);
                 //printf("%s,%f,%d,%d\n",resp[i].pointName,resp[i].value,resp[i].status,resp[i].time);
                 string p = new string(resp.pointName);
             
                 MessageBox.Show(p+"值:"+resp.value.ToString());//---------catch内容是:
未能封送类型,因为嵌入数组实例的长度与布局中声明的长度不匹配

解决方案 »

  1.   

    用byte代替char
    c# char == 16 bit 
      

  2.   

    楼上正解,char表示uncode的字符,为双字节,这点和C#中不同,可以用byte代替。
    然后用System.Text.Encoding.Default.GetString(buff, 0, buff.Length);命令转换为C#格式的字符串即可
      

  3.   

    问题仍然存在。
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 49)]
         public  char[] pointName;
    后来我把上面的改成了。
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 49)]
        public string pointName;
    上面的错误就没有了。但是Out的值不正确。始终为0.实际上是有值的。
      

  4.   

    定义成 StringBuilder 试试