2010-12-13 131 views
1

Salut après référence à http://www.mono-project.com/Embedding_Mono Je peux appeler des méthodes à partir du code managé en utilisant mono_runtime_invoke.passage de pointeurs (fonction) entre c et mono

Maintenant, je veux appeler une méthode dans le code managé avec un pointeur de fonction (ou au moins une partie pointeur) comme argument de code natif c

code managé

public delegate void MyDelegate(); 
//method i want to call from native code 
public static MyDelegate mono_method(MyDelegate c_ptr) 
{ 
    //...do sth 
    return c_ptr; 
} 

code natif

typedef void (*FUNC_PTR)(); 
FUNC_PTR my_fct_ptr = some_c_function; 
//calling the managed method   
MonoObject *result_of_mono_method = 
mono_runtime_invoke(mono_method, NULL, my_fct_ptr, NULL); 

modifier: de signaler le problème
comment puis-je appeler

public static unsafe int* mono_method(int *c_ptr) 

du code c natif, sans utiliser dllImport.

Répondre

1

Vous avez plusieurs options. L'un est d'ajouter un appel interne qui prend un IntPtr (le pointeur de fonction) et les arguments: vous allez alors lancer le pointeur sur le type de pointeur de fonction et l'appeler normalement à partir du code C. Utiliser quelque chose comme libffi peut aider à surmonter la limitation d'avoir un seul type de pointeur de fonction, cela dépend de combien vous avez besoin, vous n'avez pas spécifié.

Une autre option consiste à utiliser Reflection.Emit pour créer une méthode dynamique: dans celle-ci, vous utiliserez l'instruction calli IL pour appeler le pointeur de fonction directement.

+0

Je ne comprends pas le point dans les deux options où le pointeur c va dans C#. Pouvez-vous écrire un exemple ou clarifier un peu? – Gobliins

+0

Une autre option serait d'appeler à partir du code natif une méthode C# spécifique qui prendrait un IntPtr et l'appelait Marshal.GetDelegateForFunctionPointer. –

+0

hmm idk si je me trompe. Mais je ne veux pas mettre une méthode mono sur un pointeur de fonction c. Je veux seulement appeler une méthode mono avec un pointeur comme argument et valeur de retour. – Gobliins

0

Je ne suis pas exactement sûr de ce que vous essayez de demander ici, mais this est le moyen le plus facile de faire un rappel.

+0

si cela fonctionnerait – Gobliins

+0

Vous ne voyez pas que vous avez posté un lien parce que sur mon écran les couleurs semblent plus ou moins égales. Eh bien, votre lien appelle c à partir de mono/C# (et je l'ai déjà fait mais), d'autre part besoin d'appeler mono/C# de c. – Gobliins

+0

Il fait exactement ce que vous voulez qu'il fasse. Examinez cette source très attentivement. Il met un rappel dans le code c qui lui-même rappelle dans le code C#. – supercheetah