Неправильно выровненное / необъектное поле в структуре - PullRequest
4 голосов
/ 31 июля 2011

Я использую следующее определение для своей структуры:

[StructLayout(LayoutKind.Explicit)]
public struct NetworkMessage
{

    [FieldOffset(0)]
    public MessageType Type;
    [FieldOffset(4)]
    public bool GatewayMessage;               

    //AuthenticationRequest
    [FieldOffset(5)]
    public char[] AuthenticationUsername; //20 charachters long
    [FieldOffset(13)]
    public byte[] AuthenticationPasswordHash; // 16 bytes long

    //Authntication result
    [FieldOffset(5)]
    public bool AuthenticationSuccess;
    [FieldOffset(6)]
    public char[] AuthenticationMessage;
}

Однако, когда я пытаюсь использовать этот тип, я получаю это сообщение об ошибке:

System.TypeLoadException: не удалось загрузить тип 'NetworkMessage' из сборки, поскольку он содержит поле объекта со смещением 5, которое неправильно выровнено или перекрыто полем не-объекта.

поле объекта означает, что каждый является значением, а другой является ссылкой?Могу ли я не смешивать это?

Любая помощь очень ценится.

Спасибо, Венату

РЕДАКТИРОВАТЬ: Извинения, я должен был быть более явным в том, что я намерен это как своего рода псевдо-союз,Перекрытие полей является намеренным, чтобы позволить мне использовать одну структуру в качестве нескольких типов сообщений, упрощая буферизацию и обход системы.Извините за путаницу

1 Ответ

10 голосов
/ 01 августа 2011

Массивы должны начинаться с 4-байтовых границ.

См. Эту статью для получения дополнительной информации об использовании массивов в явных структурах. В нем также упоминается проблема четных границ для массивов и описываются некоторые альтернативные варианты для массивов в явных структурах.

http://www.developerfusion.com/article/84519/mastering-structs-in-c/

см. Также Неправильно выровнено или перекрыто ошибкой необъектного поля

...