Bonjour,

Ca fait déjà un certain temps que je galère la-dessus:

J'ai un problème sur un bout de code. J'ai une structure C++ et une structure C++/CLI correspondante:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
//code non managé
typedef struct { 
	int intA; 
	int intB; 
	} MASTRUCT;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
//code managé
[StructLayout(LayoutKind::Sequential)] 
public  ref struct MASTRUCTCLI
	public:
	int intA; 
	int intB; 
	};
et je veux appeler une fonction d'une DLL pour faire une opération avec un array rempli d'objets de cette structure, voici la fonction DLL:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
//Code non managé
extern "C" __declspec(dllexport) void Cpp(MASTRUCT *t[], int longueur) 
	 { 
	 int i ;	
	 for(i=0; i < longueur - 1 ; i++) 
			 { 
			 t[i]->intA += 10;
			 t[i]->intB += 10;
			 }
pour passer un array en paramètre je sais que je dois bien le marshaliser en alouant un bout non managé de memoire et passer l'adresse en IntPtr ce que j'ai bien fait etc.

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
//code managé
[DllImport("marshallingDLL.dll")] extern "C"  void Cpp( IntPtr p  , int longueur);
...
main(){
array<MASTRUCTCLI^> ^myArray = gcnew array<MASTRUCTCLI^>(10);
 
//remplissage du tableau..
 
int sizeBase = Marshal::SizeOf(myArray[0])
for (int i =0;i< 2;i++)
		{
		temp = IntPtr(p.ToInt32()+ i*sizeBase);
		Marshal::StructureToPtr(myArray[i],temp,false);
		}
 
Cpp(p, longueur);
Le code compile mais il me donne une exception SystemReferenceNULL, comme quoi il n'y a rien ds l'addresse que j'ai passée en paramètre à ma fonction DLL. Et en plus, pour essayer de comprendre cette exception, après la boucle de marshalisation j'ai mis une autre de" demarshalisation " qui remettait le contenu des addresses en structure (Marshal:: PtrToStructure(temp, StructureTemp)) et cette boucle me renvoie toutes les données parfaitement placées et tout.

Donc je ne comprends pas d'ou cette exception vient. Si quelqu'un pouvait m'aider j'en serais très reconnaissant.

Merci d'avance