l'interopérabilité avec une librairie native surtout C++, est quelque chose d'assez ardue en règle générale.
il faut bien que tu réalise une chose, les 2 mondes ne sont pas compatibles.
l'interopérabilité entre les 2, ne signifie aucunement compatibilité, et de façon générale, les modèles mémoires pour les types et les classes plus particulièrement diffères complètement entre l'univers natif et l'univers managé...
l'environnement managé, est capable, de manipuler des types et objets non managés, mais c'est là que s'arrête l'interopérabilité... l'inverse n'est pas possible !
en d'autres termes, tu ne peux en aucun cas fournir à ta fonction native, une instance d'un objet managé, et espérer qu'il va le modifier comme tu le souhaite.
cependant avant de repartir totalement dépité par ce constat... il existe une solution, mais complexe à mettre en œuvre et qui sort largement d'une simple aide sur ce forum.
en effet, quand tu regarde les différents tutos, le P/Invoke, c'est bien, c'est beau, ca permet des choses incroyables, et ca parait même simple... oui si tu te cantonne à appeler des fonctions avec des paramètres types intégraux (int et compagnie), mais tout le monde, et tout particulièrement les tutos font l'impasse sur la partie de P/Invoke qui le rend réellement intéressant, mais aussi très compliqué...
en un mot :
Le Marshaling !
si tu as utilisé une technologie nommée .NET Remoting, tu en a déjà entendue parler, s'était la clé pour faire des services .NET Remoting, car cela permettait notamment de générer des proxy d'appels client...
je te suggère de regarder tout ce que tu pourra trouver sur le marshaling d'objet surtout au niveau de la msdn... mots clés : p/invoke marshaling sur google par exemple.
mais il y a fort à parier que l'ensemble des résultats soit de la littérature en anglais.
Partager