我有一个这样的结构:
struct test
{
[MarshalAs(UnmanagedType.ByValArray)]
public byte[] a;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 200)]
public string b;
}
并且成员a
大小是动态的,这意味着我无法编写SizeConst
inMarshalAs
属性。
这就是问题所在:
当我尝试将其转换为byte[]
这样的:
int size = Marshal.SizeOf(t);
byte[] bs = new byte[size];
IntPtr pt = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(t, pt, false);
Marshal.Copy(pt, bs, 0, size);
Marshal.FreeHGlobal(pt);
是201,正确的size
大小是212,所以结果byte[]
是错误的。它只有第一个元素t.a
。
然后我试着像这样使尺寸正确:
int size = Marshal.SizeOf(t);
size += t.a.Length - 1;
但是即使size
是对的,结果byte[]
仍然是错误的,我怎样才能使结果正确?