我正在与一些本机库进行互操作,该库具有一些非自然对齐功能,我想在 .NET 结构中模拟布局。检查这两个结构:
public struct Int3
{
public int X;
public int Y;
public int Z;
}
public struct MyStruct
{
public short A;
public Int3 Xyz;
public short B;
}
因此,在 .NET 中,它使用自己的布局规则来创建布局,即对齐方式为 min(sizeof(primitiveSize), StructLayout.Pack)。所以 MyStruct 的布局将是:
[oo--] MyStruct.A (2 bytes data and 2 bytes padding)
[oooo oooo oooo] MyStruct.Xyz (3 int, no padding)
[oo--] MyStruct.B (2 bytes data and 2 bytes padding)
我想做的是,我想将 Int3 的对齐方式更改为 8 个字节,例如:
[StructLayout(Alignment = 8)]
public struct Int3 { .... }
然后 MyStruct 的布局将变为:
[oo-- ----] MyStruct.A (2 bytes for data, and 6 bytes padding, to align next Xyz to 8
[oooo oooo oooo ----] MyStruct.Xyz (4 bytes padding for alignment of 8)
[oo-- ----] (6 bytes padding, because the largest alignment in this struct is 8)
所以,我的问题是:
1).NET中是否有这样的属性来控制这样的非自然对齐?
2)如果没有这样的内置属性,我知道还有其他属性如StructLayout.Explict、OffsetAttribute、StructLayout.Size、StructLayout.Pack。有了这些属性,我可以手动模拟这个布局,但是不好用。所以我的第二个问题是,有没有办法挂钩 .NET 结构布局创建,我可以干扰结构布局?我的意思是,我可以创建一个自定义属性来指定对齐方式,然后我计算布局,但我不知道如何干扰.NET 使用该布局。
问候,翔。