Struct marshal in C#
I have the following struct in C#
unsafe public struct control
{
public int bSetComPort;
public int iComPortIndex;
public int iBaudRate;
public int iManufactoryID;
public byte btAddressOfCamera;
public int iCameraParam;
public byte PresetNum;
public byte PresetWaitTime;
public byte Group;
public byte AutoCruiseStatus;
public byte Channel;
public fixed byte Data[64];
}
And the function i use to convert it to byte array[] is
static byte[] structtobyte(object obj)
{
int len = Marshal.SizeOf(obj开发者_如何学JAVA);
byte[] arr = new byte[len];
IntPtr ptr = Marshal.AllocHGlobal(len);
Marshal.StructureToPtr(obj, ptr, true);
Marshal.Copy(ptr, arr, 0, len);
Marshal.FreeHGlobal(ptr);
return arr;
}
When i compile it gives
Type 'System.Byte[]' cannot be marshaled as an unmanaged structure; no meaningful size or offset can be computed.
What can be the problem? Thanks in advance!
SizeOf
doesn't work on arrays. Use array.Length * Marshal.SizeOf(elementType)
instead.
The error you are reporting as a compile error is in fact a runtime error (an ArgumentException
). When you want to use structtobyte
to convert a control
to byte[]
you should pass the method a reference to control
, not a byte
array (byte[]
).
control ctrl = new control();
byte[] bytes = structtobyte(ctrl);
精彩评论