Я пытаюсь правильно маршалировать некоторые структуры для 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 в моей арифметике указателя, который дал правильные результаты.
Я получу ожидаемое 4, если я создаю MIB_IPNETTABLE и выполняю следующий вызов:
IntPtr offset = (IntPtr)Marshal.SizeOf(ipNetTable.dwNumEntries);
Теперь в последовательной структуре смещение поля должно быть суммой размеров предыдущих полей, верно?Или же это тот случай, когда в неуправляемой структуре смещение действительно равно 8 (в системе x64), но становится равным 4 только после магии Маршаллинга?Есть ли способ получить вызов OffsetOf (), чтобы дать мне правильное смещение?Я могу хромать, используя вызовы SizeOf (), но OffsetOf () проще для больших структур.