Bonjour,
Je travaille sur une application devant lire et écrire des valeurs sur un automate. Les données sur l'automate sont définies selon un structure de données avec des booléens sur 1 byte, des int signés sur 2 byte, des chaîne de caractère de taille fixe de 21 caractères, ...
En ce qui concerne l'accès à une seule et unique valeur, ça fonctionne. J'ai définit des classes qui représente un bool automate, un int automate et un string 21 caractère automate. Voici mes classes pour un int et un string :
J'aimerais maintenant récupérer, comme c'est défini dans la structure de données automate, des tableaux de int, et surtout, des tableaux de string... En ce qui concerne le tableau de int, j'ai essayé ceci :
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 [StructLayout(LayoutKind.Sequential, Size = 2)] public class iCommunication { [MarshalAs(UnmanagedType.I2, SizeConst = 2)] public short Value; public iCommunication() { Value = 0; } public override bool Equals(object obj) { if (!(obj is iCommunication)) return false; return this == (iCommunication)obj; } public override int GetHashCode() { return base.GetHashCode(); } public static bool operator ==(iCommunication a, iCommunication b) { return a.Value == b.Value; } public static bool operator !=(iCommunication a, iCommunication b) { return !(a == b); } } [StructLayout(LayoutKind.Sequential, Size = 21)] public class sCommunication { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 21)] public string Value; public sCommunication() { Value = ""; } public override bool Equals(object obj) { if (!(obj is sCommunication)) return false; return this == (sCommunication)obj; } public override int GetHashCode() { return base.GetHashCode(); } public static bool operator ==(sCommunication a, sCommunication b) { return a.Value == b.Value; } public static bool operator !=(sCommunication a, sCommunication b) { return !(a == b); } }
Rien ne fonctionne avec les tableau de iCommunication. Par contre, ca marche avec le tableau de short. Ce n'est pas la solution idéale... Par contre, pour ce qui est d'un tableau de string, je ne sais pas comment faire. J'ai essayé ceci, mais ça ne fonctionne pas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 [MarshalAs(UnmanagedType.SafeArray, SafeArrayUserDefinedSubType=typeof(iCommunication))] //[MarshalAs(UnmanagedType.LPArray, SafeArrayUserDefinedSubType=typeof(iCommunication), SizeConst=20)] public iCommunication[] Array; //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20, ArraySubType = UnmanagedType.I2)] //public short[] Array;
Je suis un peu perdu dans ce Marshaling. J'y vais à tâton, et je ne suis pas sur de ce que je fais. Un petit coup de main serait le bienvenue...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 [MarshalAs(UnmanagedType.ByValArray, SizeConst=2)] public sCommunication[] Array;
Merci d'avance!
Partager