OVH Cloud OVH Cloud

C#.NET / C++ unmanaged - Typage

2 réponses
Avatar
Delf
Bonjour.

J'ai un programme qui utilise des DLL faites en C++ non managées.

Deux de ces DLL ont des méthodes qui reçoivent des paramètres IN
de type :

- CStringList*
- CList<CElementarySearchItem,CElementarySearchItem&> * listItem

Je pense que ce sont des types définis du language.

Que passer côté C# ? Pour CStringList*, un tableau de string fera
l'affaire ? Mais pour CList...

Merci.

--
Delf

2 réponses

Avatar
Roman
"Delf" a écrit :

Que passer côté C# ? Pour CStringList*, un tableau de string fera
l'affaire ? Mais pour CList...



Essayez de passer les parametres par ref :

[DllImport(“VotreDLL.dll”)]
public static extern void VotreMethode(ref string[] VotreStringList);
Avatar
Paul Bacelar
"Delf" wrote in message
news:426e589c$0$5645$
Bonjour.

J'ai un programme qui utilise des DLL faites en C++ non managées.

Deux de ces DLL ont des méthodes qui reçoivent des paramètres IN
de type :

- CStringList*
- CList<CElementarySearchItem,CElementarySearchItem&> * listItem

Je pense que ce sont des types définis du language.



Les noms commencent par C, ce sont donc des classes par convention de
nommage et C++ ne définit aucune classe.

Faire des exports de dll avec des instances, références ou pointeurs sur des
classes C++ dans les prototypes des fonctions est une pratique à proscrire
de toute urgence.



Que passer côté C# ? Pour CStringList*, un tableau de string fera
l'affaire ? Mais pour CList...



Aucune chance. Pour pouvoir passer librement des données d'un domaine managé
à un domaine non managé; il faut, premièrement, que les types soient
"blitable" (que la disposition mémoire du type managé soit identique à celle
du type non managé) et vos types sont bien trop complexes pour que cela soit
le cas et, secondement, "piner" (rendre les objets managés temporairement
inamovibles par le Garbage Collector) le temps de l'interaction entre le
code managé et non managé.

Pour les types non "blitable", il y a le Marshalling qui consiste à fournir
les routines de positionnement mémoires entre les deux environnements, mais
les types sont très complexes et l'utilisation de template de Classe
(Cxxx<Cyyy>) rend son utilisation extrêmement complexe et aléatoire.

Je vous conseil fortement de développer un assembly en C++ managé qui pourra
facilement manipuler les types managés et non managés et ainsi implémenter
des routines de copie des éléments des listes d'un types vers les éléments
de l'autre type.



Merci.

--
Delf




--
Paul Bacelar