[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
internal struct DllInvoices
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst=8)]
public byte[] serial;
public byte Type;
public uint Sum;
}
挪用Marshal.SizeOf(typeof(DllInvoices ))得到的巨细为16,,为什么不是13?
这其实是体系布局和汇编的问题。
在内存里特定类型数据的起始地点凡是有必然的对齐要求,好比说32位机器上的int起始地点必需是4的整数倍,布局凡是也是如此。
如果一个布局包罗一个char和一个int,那么char作为布局体的第一个字段,需要在4的整数倍地点开始,而int有同样的要求,所以char之后必需空出3个字节来,才华使int的地点满足对齐的要求。
.NET的CLR是基于32位的,所以也由上述要求。在你的byte之后,必需空出3个字节。所以
功效就是16个字节了。
可以通过StructLayout的Pack属性转变这种对齐设置——如果有须要的话:
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi,Pack=1)] 功效就是13了。