Bonjour,
J'ai besoin d'adapter un morceau de code interfaçant un driver, écrit sous C++, dans le but de faire le fonctionner sous C#. Maintenant, je suis capable de le compiler et le faire travailler sans problème sous C++, mais je ne vois pas comment le faire avec C#.
Bref, la difficulté se trouve en le passe d'une struct comme un paramètre de une fonction C#.
La struct (qui elle-même contient une autre struct) ressemble le suivant:
Sous C++
=======
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| struct {
short s11;
short s12;
short s13;
short s14;
struct2 sa[20]
} struct1
struct{
long l21;
long l22;
long l23;
long l24;
short s21;
short s22;
short s23;
short s24;
} struct2 |
Sous C# (En adaptant le type long au type int, pour le faire occuper 4 bytes)
=======
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| struct {
short s11;
short s12;
short s13;
short s14;
struct2 sa[20]
} struct1
struct{
int l21; // long sous C++ --> int sous C# (4 bytes)
int l22;
int l23;
int l24;
short s21;
short s22;
short s23;
short s24;
} struct2 |
et le fonction est pareille à la suivante:
Sous C++
=======
Declaration...
-----------------
int function1 (struct1* pStruct1);
Appel...
--------
int1 = function1 (&pStruct1); // Une fois la pStruct1 remplie avec les données
Sous C# (Les problèmes arrivent):
========================
Declaration...
-----------------
1 2 3 4
| [DllImport(_dllLocation)]
public static extern int function1(
struct1 pStruct1,
); |
Appel...
-------
int1 = StaticClass.function1(pStruct1); // Une fois la pStruct1 remplie avec les données
***********************
J'ai essayé des differentes possibilités, mais sans aucun réponse satisfaisante
1) En déclarant...
Avant la struct...
[StructLayout(LayoutKind.Sequential, Pack=1, Size=488)] / Size=24)]
Entre les champs de la struct...
[FieldOffset(0)] / [FieldOffset(2)] / ...
Je reçois une erreur
HRESULT "(HRESULT Exception: 0x80070057 (E_INVALIDARG))"
2) En déclarant...
Avant le struct array...
[MarshalAs(UnmanagedType.SafeArray,SizeConst=20)
Je reçois la même erreur
3) En laissant pStruct déclarée seulement, mais sans la remplir avec d'information, la fonction me laisse l'appeler, mais je n'observe pas de fonctionnement.
Je serais très remercié de pouvoir recevoir n'importe quelle aide / recommandation, car je me trouve maintenant bloqué et je ne sais pas comment suivre.
Merci de vos réponses.
Partager