使用填充将C#类与C ++类对齐

时间:2019-05-06 22:34:29

标签: c# c++ marshalling padding memory-alignment

我正在尝试将C#类与C ++类对齐,以便可以RPM C#中的结构。 C ++类的填充为0x10,但我似乎无法将C#类与C ++类对齐。

C ++类:

class Value
{
public:
    char pad_0x0000[0x10]; //0x0000
    float current; //0x0010 
    float maximum; //0x0014 
};

我的C#类:

class Value
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x10)]
    public byte[] pad_0x0000 = new byte[0x10]; //0x0000
    public float current; //0x0010 
    public float maximum; //0x0014 
};

问题是,每当我尝试使用Marshal.SizeOf来获取结构的大小时,都会出现此错误:

不能将值作为非托管结构进行封送;无法计算出有意义的尺寸或偏移量。

我可能完全错了。我要做的就是用0x10填充,以便2个类对齐

预先感谢

编辑:我遵循了汉斯·帕桑特的建议,现在它可以编译并正常运行

[StructLayout(LayoutKind.Sequential)]
class Value
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x10)]
    public byte[] pad_0x0000 = new byte[0x10]; //0x0000
    public float current; //0x0010 
    public float maximum; //0x0014 
};

但是,current的值仍然不正确,这意味着它们未正确对齐。所以我的问题是: 不是吗

char pad_0x0000[0x10]; //0x0000

与此尺寸相同

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x10)]
public byte[] pad_0x0000 = new byte[0x10]; //0x0000

如果没有,那么我如何获得与C#中的C ++ pad等效的东西?

0 个答案:

没有答案