请教 C# 中有关 Marshal 的问题

简要的地说一下问题:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
class C1
{
        public byte a = 0;
        public byte b = 0;
        public byte c = 0;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
class C2
{
        [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 4)]
        public C1[] c1 = new C1[4].Select(s => s = new C1()).ToArray();
        public C1 c2 = new C1();
}

有上面两个类(必须是类,不能是结构),如何将C2转换为字节数组呢?

现在对C2计算大小就不正确。Marshal.SizeOf(typeof(C2))的结果是19,但实际上不是应该是15吗?
请问是为什么,应该怎样解决?

谢谢!

你给C#提出了一个不可能实现的要求。要固定内存的分布,必须是结构体,不能是类。