Salut,

J'ai un probl�me �trange avec Marshal.SizeOf...

Je souhaite manipuler la structure native suivante (en-t�te d'un fichier bitmap) :
Code C : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
typedef struct tagBITMAPFILEHEADER { 
  WORD    bfType; 
  DWORD   bfSize; 
  WORD    bfReserved1; 
  WORD    bfReserved2; 
  DWORD   bfOffBits; 
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;

J'ai donc �crit l'�quivalent en C# :
Code C# : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        [StructLayout(LayoutKind.Explicit)]        
        private struct BITMAPFILEHEADER
        {
            public static readonly short BM = 0x4d42; // BM
 
            [FieldOffset(0)]
            public short bfType;
            [FieldOffset(2)]
            public int bfSize;
            [FieldOffset(6)]
            public short bfReserved1;
            [FieldOffset(8)]
            public short bfReserved2;
            [FieldOffset(10)]
            public int bfOffBits;
        }
Le layout explicite est n�cessaire pour que le marshalling n'aligne pas les champs sur les bornes de 32bits (�a d�calerait tous les champs � partir du 2e, ce qui corromprait l'en-t�te).

Quand je copie cette structure vers la m�moire non-manag�e avec Marshal.Copy, le layout explicite est bien pris en compte et les donn�es binaires sont correctes.

Par contre, Marshal.SizeOf me renvoie 16
Pourtant, j'ai beau compter et recompter, �a fait 14... d'ailleurs si j'�cris 16 octets d'en-t�te, le fichier est incorrect et illisible. Si je ne tiens pas compte de ce que dit Marshal.Sizeof et que j'utilise une taille de 14, �a fonctionne nickel.

En fait, on dirait qu'il ne tient pas compte du layout explicite dans le calcul de la taille J'ai aussi essay� avec l'op�rateur sizeof (dans un bloc unsafe), le r�sultat est le m�me.

Bref, je ne trouve aucun moyen d'obtenir une taille correcte autrement qu'en la codant en dur. Quelqu'un aurait une id�e de comment faire ? Ou une explication de ce comportement ?