Marshalling probleme

sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 - 10 mai 2005 à 15:33
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 10 mai 2005 à 23:31
Bonjour a tous,

voila, j'ai un petit souci de marshalling, comme l'indique le sujet, je vous explique. J'ai ecrit une dll en C qui, a un moment donner, recoit par callback une char *data et un uint data_len, et je voudrais passer ces donners a une fonction C# qui serait aussi appler comme une callback.

(desoler pour ceux qui connaissent pas le language C)
en gros, dans ma dll il y a une fonction du style :

void SetCallback(callback_func f);

et callback_func est declarer comme ceci :

typedef void (*callback_func)(char[] data, unsigned int data_len);

Ensuite, dans ma fonction C de ma dll qui est appeler en callback, je fait un truc du style :

void TreatmentFunction(char* data, unsigned int data_len)
{
_f(data, data_len);
}

_f etant la fonction passée via la fonction SetCallback decrite un peu plus haut. Bref, j'espere que jusqu'ici ca va et que tout le monde suit. Le souci c'est que la fonction SetCallback est une fonction externe, et donc c'est celle la que j'appel dans mon code C#, je lui file un delegate.

En gros j'ai ca :

public delegate void MyTreatmentDelegate(char[] data, uint data_len);

...

[DllImport("mydll.dll")]
private static extern void SetCallback(MyTreatmentDelegate func);

et ensuite dans mon code, je fait SetCallback(new MyTreatmentDelegate(une_fonction));

une_fonction etant declarer comme le preconise le delegate (de toute facon ca compilerais pas sinon)

Bon pour finir, le probleme c'est que j'ai tenter plusieurs facon differente et rien ne marche, un coup j'ai un MarshallTrucBiduleException, un coup c'est une erreur Win32, un coup une Win32Exception... bref, il semble ne pas vouloir du char[] data, donc j'ai tenter avec un IntPtr mais ca marche pas non plus. Un coup j'ai eu un truc qui disait que je pouvais pas marshaller un array manager vers un truc non manager, enfin j'ai eu tellement de messages d'erreur que je me souvient pas de tous et de ce qu'ils disaient...

J'ai fait un truc pas comme il faut et j'espere que vous pourrez m'aider a remettre les choses dans le bonne ordre.

Merci d'avance a tous :)

11 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
10 mai 2005 à 16:44
Avec char* ton delegate ne devrait pas plutot etre de cette forme là ? :

public delegate void MyTreatmentDelegate(string data, uint data_len);

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
10 mai 2005 à 17:00
je vais essayer
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
10 mai 2005 à 17:23
ca ne fonctionne pas :S j'ai tester avec un StringBuilder car je crois me souvenir que les char* sont marshaller en StringBuilder, mais ca chie, ca dit que j'ai depasser la capaciter alors j'ai meme pas declarer mon StringBuilder (je peux pas car c'est un parametre et que c'est le CLR qui est censer le declarer)

je continnue a creuser
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
10 mai 2005 à 18:13
Peut etre ca n'a rien a voir.. mais ne devrais tu pas proteger ton delegue du GC !?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
10 mai 2005 à 18:18
Bien vu :-)
Je n'avais pas fait attention au "SetCallback(new MyTreatmentDelegate(une_fonction));"
Si le GC passe par là au moment du Callback ça fait désordre :p

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
10 mai 2005 à 20:38
non, dans ce genre de cas, tant que l'appel n'est pas terminé, le CLR maintient la reference, de ce fait le GC ne la nettoie pas...

je dois admettre que je parle sans certitudes, si ce n'est que je suis certains que ne pas garder la reference d'un objet "newer" directement dans le passage de parametres, est la chose la plus absurde qui pourait avoir ete decider par Microsoft... ce dont je doute :)
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
10 mai 2005 à 20:57
Le problème est justement que l'appel se termine avant que ton callback ne soit "appelé".
SetCallback n'est pas bloquant logiquement.
Hors new MyTreatmentDelegate(une_fonction)); ça donne une variable locale à la méthode qui contient SetCallback(new MyTreatmentDelegate(une_fonction));
Ce qui fait qu'a la fin de l'execution de la methode c'est censé etre libérable.

SetCallback(new MyTreatmentDelegate(une_fonction));
=>
MyTreatmentDelegate leDelegate = new MyTreatmentDelegate(une_fonction)
SetCallback(leDelegate);"

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
10 mai 2005 à 21:14
j'ai changer etant donner que ca ne coute rien de le faire :) mais il etait previsible que ca ne change rien... le probleme est toujours au niveau du Marshalling et de l'echange des données entre la DLL et le CLR.
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
10 mai 2005 à 22:34
oups je crois que mon explication est mal formée et peut etre mal interpretée :
"SetCallback(new MyTreatmentDelegate(une_fonction));
=>
MyTreatmentDelegate leDelegate = new MyTreatmentDelegate(une_fonction)
SetCallback(leDelegate);""
Je voulais dire par là que c'etait equivalent.

Tu devrais mettre leDelegate en tant que champs de la classe, ainsi il aurait la même durée de vie que ton instance de classe.

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
10 mai 2005 à 23:25
je me suis deja assurer que mon deleguer ai la meme durée de vie que le temps necessaire a la realisation des operations que j'ai besoin d'effectuer

Cependant, virgule, celà ne résoud en rien mon actuel problème, point.

(desoler, je trouve pas la et comme ca me gonfle, je tente de m'auto-distraire avec des trucs pas droles )
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
10 mai 2005 à 23:31
lol
Là je ne vois pas ce que je pourrais dire de plus.
Pas possible d'aider plus que ça, dsl :-(

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
Rejoignez-nous