我有这样的结构:
struct test
{
[MarshalAs(UnmanagedType.ByValArray)]
public byte[] a;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 200)]
public string b;
}
且成员a
大小是动态的,这意味着我无法在SizeConst
属性中编写MarshalAs
。
以下是问题:
当我尝试将其转换为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);
size
是201,正确的尺寸是212,因此结果byte[]
是错误的。它只有t.a
中的第一个元素。
然后我试着让尺寸正确如下:
int size = Marshal.SizeOf(t);
size += t.a.Length - 1;
但即使size
是正确的,结果byte[]
仍然是错误的,我怎样才能使结果正确?