如果要完全使用每个类/结构成员,是否必须在FieldOffset上使用?

问题描述 投票:0回答:1

考虑到我需要确保以非常特定的方式将类/结构映射到内存的情况,可能是由于需要匹配外部协议:

[StructLayout(LayoutKind.Sequential, pack=1)]
public class SYSTEM_INFO
{
 public ulong OemId;
 public ulong PageSize;
 public ulong ActiveProcessorMask;
 public ulong NumberOfProcessors;
 public ulong ProcessorType;
}

然后我考虑做一个'覆盖'(这是一个恰当的词吗?),所以我可以直接访问内存:

[StructLayout(LayoutKind.Explicit)]
public class SYSTEM_INFO
{
[FieldOffset(0)] public byte Buffer[40]; //overlays all the bytes, like a C union
[FieldOffset(0)] public ulong OemId;
[FieldOffset(8)] public ulong PageSize;
[FieldOffset(16)] public ulong ActiveProcessorMask;
[FieldOffset(24)] public ulong NumberOfProcessors;
[FieldOffset(32)] public ulong ProcessorType;
}

但是这很耗时且容易出错(如果发生某些更改,我很容易将所有FieldOffset值更新为混乱)

是否可以将Buffer覆盖成员,但所有成员except Buffer自动且顺序对齐而无需填充的两种方法进行组合?我不能从文档中看出是否允许这样做,并且我可以强制某些成员偏移,而其他成员则自动确定。

c# marshalling structlayout
1个回答
0
投票

对于struct,您可以非常轻松地进行-坦率地说,如果您要查看字节,则应该[[通常

© www.soinside.com 2019 - 2024. All rights reserved.