Salut,
Je galère un peu à ce niveau et j'aimerai mieux comprendre le fonctionnement, j'ai testé différentes choses, maintenant j'arrive a récupérer un tableau du côté c#, par contre comment on détruit le pointeur qui a été initialisé ?
Quand j'utilise Marshal.FreeCoTaskMem le code s'arrête côté c#, donc visiblement ça ne doit pas lui plaire. J'ai réussi en bataillant pas mal que ça soit du côté c++/cli ou c++ en unmanaged si j'ai bien compris, à pouvoir exploiter ça sous c# c'est un peu la dernière étape avant de faire des choses plus complexes, et là j'ai du mal à capter.
Côté C++ comme on peut voir j'ai testé aussi avec maloc
Code C++ : 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 extern "C" __declspec(dllexport) bool ArraySample(/*ItemListHandle * hItems*/ double** itemsFound, int* itemCount) { //OutputDebugString(L"test"); // initialization d'un tableau auto items = new std::vector<double>(); for (int i = 0; i < 500; i++) { items->push_back((double)i); } *itemCount = items->size(); *itemsFound = items->data(); /*auto size = (*itemCount) * sizeof(double); itemsFound = static_cast<double*>(malloc(size)); memcpy(*itemsFound, items->data(), size);*/ return true; }
Pour le C# la version actuelle qui exploite ce tableau:
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 IntPtr arrPtr; int taille; ArraySample(out arrPtr, out taille); double[] theArray = new double[taille]; Marshal.Copy(arrPtr, theArray, 0, taille); Marshal.FreeCoTaskMem(arrPtr);
Vu que c'est une copie si je ne me plante pas je dois effacer ce qui a été mis en mémoire par le c++ ? non ?
Partager