读书人

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

发布时间: 2012-03-26 15:46:56 作者: rapoo

急救!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#格式的字符串即可

读书人网 >C#

热点推荐