64-битная P / Invoke идиосинкразия - PullRequest
2 голосов
/ 11 октября 2010

Я пытаюсь правильно маршалировать некоторые структуры для 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 () проще для больших структур.

1 Ответ

2 голосов
/ 11 октября 2010

В 64-битной сборке C / C ++ смещение вашего поля table будет равно 8 из-за требований выравнивания (если вы не принудили это иначе) Я подозреваю, что CLR делает с вами то же самое:

Элементы объекта располагаются последовательно, в том порядке, в котором они появляются, когда экспортируется в неуправляемую память. Элементы расположены в соответствии с упаковкой, указанной в StructLayoutAttribute.Pack, и могут быть несмежными.

Вы можете использовать этот атрибут или использовать атрибут LayoutKind.Explicit вместе с атрибутом FieldOffset в каждом поле, если вам нужен такой уровень контроля.

...