6 votes

Champ mal aligné/non-objet dans une structure

J'utilise la définition suivante pour ma structure :

[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;
}

Cependant, lorsque j'essaie d'utiliser ce type, j'obtiens le message d'erreur suivant :

System.TypeLoadException : Impossible de charger le type 'NetworkMessage' à partir de l'assemblage car il contient un champ d'objet à l'offset 5 qui est incorrectement aligné ou chevauché par un champ non-objet.

Un champ non-objet signifie-t-il que l'un est une valeur et l'autre une référence ? Ne puis-je pas les mélanger ?

Toute aide est la bienvenue.

Merci, Venatu

EDIT : Mes excuses, j'aurais dû être plus explicite sur le fait que j'envisage ceci comme une sorte de pseudo-union. Le chevauchement des champs est intentionnel pour me permettre d'utiliser une structure comme plusieurs types de messages, ce qui facilite la mise en mémoire tampon et le passage dans le système. Désolé pour la confusion

12voto

hatchet Points 7251

Les tableaux doivent commencer sur des limites de 4 octets.

Voir cet article pour plus d'informations sur l'utilisation de tableaux dans des structures explicites. Il mentionne également le problème des limites paires pour les tableaux, et décrit quelques options alternatives pour les tableaux dans les structures explicites.

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

Voir aussi Mauvais alignement ou chevauchement par une erreur de champ sans objet

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X