Problème de Marshaling de tableaux
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 :
Code:
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);
}
} |
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:
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; |
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:
1 2 3
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst=2)]
public sCommunication[] 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...
Merci d'avance!