Bonjour,
Donc problème de marshalling du jour , j'ai déclaré plusieurs classes qui sont équivalente à des classes déjà existante dans une application, ces classes permette de remplir un fichier binaire. Le but est de relire ces fichiers binaires depuis une nouvelle application c#. Donc j'ai recréé les classes en questions.
Donc pour lire mon fichier j'utilise un objet BinaryReader dans lequel je récupère un tableau de Byte de taille = à la taille de ma structure.
Petit exemple:
Voila une de mes structure :
Y a un truc que je n'arrive pas à expliquer c'est le Sizeof de la classe Marshal me renvoie une taille supérieur de 2 octets à ce que je calcule. Donc derrière ça me décale mon pointeur dans mon flux binaire de 2 octets. Dans ce cas la pour moi la taille est de 200 octets et la il me retourne 202. Je voulais savoir si vous avez une idée de ou pouvez venir ces 2 octets supplémentaire. Apres comme le sizeof ne prend pas le type mais un objet...
Code : 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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 [StructLayout(LayoutKind.Sequential)] class cScreenInfo { private int _idVersion; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] private Byte[] _name; private short _id; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] private Byte[] _f1; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] private Byte[] _f2; private short _h; private short _w; private short _offX; private short _offY; private short _charWidth; private short _charHeight; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 26)] private short[] _arrayLineY; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] private Byte[] _helpScreen; public static bool LireStructure(BinaryReader pFluxBinaire, out cScreenInfo pStructARemplir) { bool bRetour = true; Byte[] TableauByte; pStructARemplir = null; try { pStructARemplir = new cScreenInfo(); cTestTmp test = new cTestTmp(); int Size = Marshal.SizeOf(pStructARemplir); int Size2 = Marshal.SizeOf(test); IntPtr PtrDestination = Marshal.AllocHGlobal(Size); TableauByte = pFluxBinaire.ReadBytes(Size); Marshal.Copy(TableauByte, 0, PtrDestination, Size); pStructARemplir = (cScreenInfo)Marshal.PtrToStructure(PtrDestination, typeof(cScreenInfo)); } catch (Exception e) { Loggers.Default.Error(e, "cScreenInfo.LireStructure(BinaryReader, cScreenInfo)"); bRetour = false; } return bRetour; } }
Partager