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++
=======

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
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)
=======

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
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...
-----------------
Code : Sélectionner tout - Visualiser dans une fenêtre à part
int function1 (struct1* pStruct1);
Appel...
--------
Code : Sélectionner tout - Visualiser dans une fenêtre à part
int1 = function1 (&pStruct1);		// Une fois la pStruct1 remplie avec les données
Sous C# (Les problèmes arrivent):
========================

Declaration...
-----------------
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
[DllImport(_dllLocation)]            
public static extern int function1(    
            struct1 pStruct1,    
);
Appel...
-------
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
[StructLayout(LayoutKind.Sequential, Pack=1, Size=488)] / Size=24)]
Entre les champs de la struct...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
[FieldOffset(0)] / [FieldOffset(2)] / ...
Je reçois une erreur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
HRESULT "(HRESULT Exception: 0x80070057 (E_INVALIDARG))"
2) En déclarant...
Avant le struct array...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
[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.