【发布时间】:2010-10-11 12:34:00
【问题描述】:
我正在尝试为 P/Invoke 正确编组一些结构,但在 64 位操作系统上进行测试时发现奇怪的行为。
我有一个结构定义为:
/// <summary>http://msdn.microsoft.com/en-us/library/aa366870(v=VS.85).aspx</summary>
[StructLayout(LayoutKind.Sequential)]
private struct MIB_IPNETTABLE
{
[MarshalAs(UnmanagedType.U4)]
public UInt32 dwNumEntries;
public IntPtr table; //MIB_IPNETROW[]
}
现在,要获取表的地址,我想像这样调用 Marshal.OffsetOf():
IntPtr offset = Marshal.OffsetOf(typeof(MIB_IPNETTABLE), "table");
这应该是 4 - 我已经转储了缓冲区的字节以确认这一点,并在我的指针算法中用硬编码的 4 替换了上述调用,这产生了正确的结果。
如果我实例化 MIB_IPNETTABLE 并执行以下调用,我确实得到了预期的 4:
IntPtr offset = (IntPtr)Marshal.SizeOf(ipNetTable.dwNumEntries);
现在,在顺序结构中,字段的偏移量应该是前面字段大小的总和,对吗?还是当它是一个非托管结构时,偏移量确实是 8(在 x64 系统上),但只有在编组魔法之后才变成 4?有没有办法让 OffsetOf() 调用给我正确的偏移量?我可以使用对 SizeOf() 的调用来跛行,但 OffsetOf() 对于较大的结构更简单。
【问题讨论】:
-
该结构翻译不正确。事实上
table在一个内联数组中。