我正在尝试将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等效的东西?