Marshalled结构中的枚举类型为Marshall.OffsetOf生成不正确的偏移量

时间:2015-07-13 16:24:53

标签: c# struct enums pinvoke marshalling

我有一种类型,我试图从一些C代码填充。但是,当我将枚举类型作为结构的一部分时,尝试计算字节偏移时,我会得到一些非常奇怪的行为。

在这个例子中,您可以看到我已经指定所有字段应该以字节偏移量0开始(假设C类型是一个联合)。我有两个定义的枚举,一个是大小的int,一个是大小字节。

{
    public enum ByteEnum : byte { }
    public enum IntEnum : int { }

    [StructLayout(LayoutKind.Explicit)]
    public struct UserData
    {
        [FieldOffset(0)]
        public int i1;

        [FieldOffset(0)]
        public long l1;

        [FieldOffset(0)]
        public IntEnum intEnum;

        [FieldOffset(0)]
        public int i2;

        [FieldOffset(0)]
        public int i3;

        [FieldOffset(0)]
        public ByteEnum byteEnum;

        [FieldOffset(0)]
        public int i4;
    }
}

当我打电话时

Marshal.OffsetOf(type, fieldInfo.Name)

我希望它为所有字段返回0,因为我已明确将其设置为所有字段偏移。

实际上这是我的输出:

UserData
i1 : 0
l1 : 0
intEnum : 0
i2 : 4
i3 : 4
byteEnum : 4
i4 : 5

请注意,在每个枚举字段之后,OffsetOf会一直返回0 + sizeof(枚举字段)。这导致我得到C结构的完全错误的字节偏移。我不知道为什么会这样?有什么想法吗?有什么特别关于枚举类我错过了导致这种行为吗?提前致谢

0 个答案:

没有答案