首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

急救!C#调用C++的dll,未能封装类型解决办法

2012-03-26 
急救!C#调用C++的dll,未能封装类型//********************************************************#defineEF

急救!C#调用C++的dll,未能封装类型
//********************************************************
#define   EFMI_POINTNAMELENGTH48
//结构
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,
unsignedlong   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内容是:
未能封送类型,因为嵌入数组实例的长度与布局中声明的长度不匹配

[解决办法]
用byte代替char
c# char == 16 bit


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

热点排行