c# interopérabilité et vectors
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:
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:
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 ?