Когда я должен явно указать StructLayout? - PullRequest
6 голосов
/ 26 декабря 2008

Я возился с вызовом DLL из C # и столкнулся с необходимостью определить свои собственные структуры. Множество статей вынуждают последовательный макет структуры с

[StructLayout(LayoutKind.Sequential)]
struct Foo ...

Итак, я последовал за сюитой, и моя программа сработала. Теперь, когда я вынул линию, она все еще работает. Зачем мне это нужно?

Ответы [ 3 ]

4 голосов
/ 26 декабря 2008

Внутренняя структура управляемой структуры недокументирована и не обнаруживается. Детали реализации, такие как заказ участника и упаковка, намеренно скрыты. С атрибутом [StructLayout] вы заставляете маршаллера P / Invoke навязывать определенную компоновку и упаковку.

То, что значение по умолчанию соответствует тому, что вам нужно, чтобы ваш код заработал, является просто случайностью. Хотя не редкость. Обратите внимание на свойство Type.StructLayoutAttribute.

1 голос
/ 17 марта 2010

Интересный момент. Я уверен, что у меня был код, который не удался, пока я не вставил явно LayoutKind.Sequential, однако я подтвердил, что Sequential является структурой по умолчанию даже в 1.1.

Обратите внимание на VB Reference для структуры подразумевает в Примечаниях> Поведение> Потребление памяти, что вам нужно указать StructLayout для подтверждения расположения памяти, но документацию для StructLayoutAttribute состояния Последовательный - это значение по умолчанию для структур в компиляторах Microsoft.

0 голосов
/ 27 декабря 2008

Я не совсем уверен, но это может повлиять на двоичную сериализацию - он может выплевывать поля в порядке, не используя информацию об именах или порядке (в результате получается файл меньшего размера), но это полная прихоть.

...