小弟问题如下:C++里:
//定义CAN信息帧的数据类型。
typedef struct _VCI_CAN_OBJ{
UINT ID;
UINT TimeStamp;
BYTE TimeFlag;
BYTE SendType;
BYTE RemoteFlag;//是否是远程帧
BYTE ExternFlag;//是否是扩展帧
BYTE DataLen;
BYTE Data[8];
BYTE Reserved[3];
}VCI_CAN_OBJ,*PVCI_CAN_OBJ;//数据发送
ULONG SenddataCan(PVCI_CAN_OBJ pSend,ULONG Len)//SendData请问在C#里,如何定义和C++相同的结构体VCI_CAN_OBJ,而后定义一个结构体指针传递给数据发送函数SenddataCan.
结构体内含指定大小的byte数组,C#如何在结构体内定义该数组.解决问题者,马上给分!!!!!!!!!!!
//定义CAN信息帧的数据类型。
typedef struct _VCI_CAN_OBJ{
UINT ID;
UINT TimeStamp;
BYTE TimeFlag;
BYTE SendType;
BYTE RemoteFlag;//是否是远程帧
BYTE ExternFlag;//是否是扩展帧
BYTE DataLen;
BYTE Data[8];
BYTE Reserved[3];
}VCI_CAN_OBJ,*PVCI_CAN_OBJ;//数据发送
ULONG SenddataCan(PVCI_CAN_OBJ pSend,ULONG Len)//SendData请问在C#里,如何定义和C++相同的结构体VCI_CAN_OBJ,而后定义一个结构体指针传递给数据发送函数SenddataCan.
结构体内含指定大小的byte数组,C#如何在结构体内定义该数组.解决问题者,马上给分!!!!!!!!!!!
public struct VCI_CAN_OBJ
{
变量
byte[] aa=new byte[100];
}
定义一个结构体的变量
VCI_CAN_OBJ vciobj;
期待测试过的高人.
uint ID;
uint TimeStamp;
byte TimeFlag;
byte SendType;
byte RemoteFlag;//是否是远程帧
byte ExternFlag;//是否是扩展帧
byte DataLen;
byte Data[8];
byte Reserved[3];
};
因为C#中没有指针,所以需要用其他的类型转换,可以用byte【】数组,也可以用System.Int32,还可以自己定义一个结构来转换
ulong SenddataCan(byte []pSend,ULONG Len),需要自己写程序转换到数组中来,
ulong SenddataCan(System.Int32 pSend,ULONG Len),
最后一种我也只是在网上看到过,具体怎么实现,还没试过
uint ID;
uint TimeStamp;
byte TimeFlag;
byte SendType;
byte RemoteFlag;//是否是远程帧
byte ExternFlag;//是否是扩展帧
byte DataLen;
byte []Data;
byte []Reserved;
};
因为C#中没有指针,所以需要用其他的类型转换,可以用byte【】数组,也可以用System.Int32,还可以自己定义一个结构来转换
ulong SenddataCan(byte []pSend,ULONG Len),需要自己写程序转换到数组中来,
ulong SenddataCan(System.Int32 pSend,ULONG Len),
最后一种我也只是在网上看到过,具体怎么实现,还没试过,楼主可以去试试
那在Struct 里面就不要new byte[100];
直接就 byte[] aa;//只声明byte型的数组。用的时候再new byte[];Public Struct VCI_CAN_OBJ
{
public byte[] aa;
}VCI_CAN_OBJ vobj;
bobj.aa = new byte[n...];
{
public char DataType;
public int Srv_index;
public char ConvertType;
//这个个地方要指定长度,这样就可以的德奥结构体的正确长度了
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public int[] VecLayer;//需要那几个图层。
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public int[] GridLayer;//需要那几个栅格图层
public int Scale_index;//需要的是那个比例尺的图像
public int x_pos;
public int y_pos;
public int ClientArea_x;
public int ClientArea_y;
}
//使用这个方法将你的结构体转化为bytes数组
public static byte[] Struct2Bytes(ImageDataMsg obj)
{
int size = Marshal.SizeOf(obj);
byte[] bytes = new byte[size];
try
{
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(obj, ptr, false);
Marshal.Copy(ptr, bytes, 0, size);
Marshal.FreeHGlobal(ptr);
return bytes;
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
return bytes;
}
}//使用这个方法将byte数组转化为结构体
public static object BytesToStuct2(byte[] bytes, ImageDataMsg type)
{
//得到结构体的大小
int size = Marshal.SizeOf(type);
//byte数组长度小于结构体的大小
if (size > bytes.Length)
{
//返回空
return null;
}
//分配结构体大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将byte数组拷到分配好的内存空间
Marshal.Copy(bytes, 0, structPtr, size);
//将内存空间转换为目标结构体
object obj = Marshal.PtrToStructure(structPtr, typeof(ImageDataMsg));
//释放内存空间
Marshal.FreeHGlobal(structPtr);
//返回结构体
return obj;
}
不知道这样是不是可以解决你的问题?
C++里:
//定义CAN信息帧的数据类型。
typedef struct _VCI_CAN_OBJ{
UINT ID;
UINT TimeStamp;
BYTE TimeFlag;
BYTE SendType;
BYTE RemoteFlag;//是否是远程帧
BYTE ExternFlag;//是否是扩展帧
BYTE DataLen;
BYTE Data[8];
BYTE Reserved[3];
}VCI_CAN_OBJ,*PVCI_CAN_OBJ; //数据发送
ULONG SenddataCan(PVCI_CAN_OBJ pSend,ULONG Len)//SendData 请问如何能将其传入函数ULONG SenddataCan(PVCI_CAN_OBJ pSend,ULONG Len)//SendData
(即结构体作参数传递进函数,pSend是一个结构体指针) 首先加载DLL:
[DllImport("CANLINK.dll",
EntryPoint = "SenddataCan",
CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
unsafe public static extern ulong SenddataCan([MarshalAs(UnmanagedType.LPStruct)]CAN_OBJ MySendOBJ, ulong Len);
这里是否该这样写([MarshalAs(UnmanagedType.LPStruct)]CAN_OBJ MySendOBJ
再传递参数
CAN_OBJ send;//定义结构体
send.ID = 0x00000100;
byte[] mydata =new byte[8];
mydata[0] =1;
mydata[1]=1;
mydata[2] = 1;
mydata[3] = 1;
mydata[4] = 1;
mydata[5] = 1;
mydata[6] = 1;
mydata[7] = 1;
send.Data = mydata;
SenddataCan(send, 1);//?这里结构体send该如何正确传入???以上代码编译无错,运行时候提示:
未处理的“System.Runtime.InteropServices.MarshalDirectiveException”类型的异常出现在 CANtest.exe 中。其他信息: 无法封送处理“parameter #1”: 无效的托管/非托管类型组合(该值类型必须与 Struct 成对出现)。
EntryPoint = "SenddataCan",
CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
unsafe public static extern ulong SenddataCan(ref CAN_OBJ MySendOBJ, ulong Len); 调用
SenddataCan(ref send, 1);可以执行,但是结果却是不对的,网上也有类似问题,请高人指点一下这是为何,如何才能正确搞定!
public static byte[] Struct2Bytes(ImageDataMsg obj)
{
int size = Marshal.SizeOf(obj);
byte[] bytes = new byte[size];
try
{
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(obj, ptr, false);
Marshal.Copy(ptr, bytes, 0, size);
Marshal.FreeHGlobal(ptr);
return bytes;
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
return bytes;
}
} 可是在定义结构体的时候需要在数组的前面加上
public struct ImageDataMsg
{
public char DataType;
public int Srv_index;
public char ConvertType;
//这个个地方要指定长度,这样就可以的德奥结构体的正确长度了
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public int[] VecLayer;//需要那几个图层。
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public int[] GridLayer;//需要那几个栅格图层
public int Scale_index;//需要的是那个比例尺的图像
public int x_pos;
public int y_pos;
public int ClientArea_x;
public int ClientArea_y;
}
{
public uint ID;
public uint TimeStamp;
public byte TimeFlag;
public byte RemoteFlag;//是否是远程帧
public byte ExternFlag;//是否是扩展帧
public byte DataLen;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] Data;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] Reserverd;
}//数据发送
ULONG SenddataCan(ref _VCI_CAN_OBJ pSend,ULONG Len)//SendData
{
public uint ID;
public uint TimeStamp;
public byte TimeFlag;
public byte RemoteFlag;//是否是远程帧
public byte ExternFlag;//是否是扩展帧
public byte DataLen;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] Data;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] Reserverd;
}//数据发送,这里也改正过来
uint SenddataCan(ref _VCI_CAN_OBJ pSend,uint Len)//SendData