2010-12-13 4 views
1

Hallo nach Bezug auf http://www.mono-project.com/Embedding_Mono Ich kann Methoden aus verwaltetem Code aufrufen, indem Sie mono_runtime_invoke verwenden.Übergabe (Funktion) Zeiger zwischen c und Mono

Jetzt möchte ich mit einem Funktionszeiger (oder zumindest einige Zeiger) als Argument von nativen C-Code

ein Verfahren, in dem verwalteten Code aufzurufen Code verwaltet

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; 
} 

nativen Code

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); 

edit: das Problem
, wie ich nennen

kann darauf hinweisen,

aus nativem c-code, ohne dllImport zu verwenden.

Antwort

1

Sie haben mehrere Möglichkeiten. Einer besteht darin, einen internen Aufruf hinzuzufügen, der ein IntPtr (den Funktionszeiger) und die Argumente verwendet: Sie werden dann den Zeiger auf den Funktionszeigertyp umwandeln und es normalerweise von C-Code aufrufen. Die Verwendung von etwas wie libffi kann helfen, die Beschränkung zu überwinden, nur einen Funktionszeigertyp zu haben, es hängt davon ab, wie viel Sie brauchen, haben Sie nicht spezifiziert.

Eine weitere Option ist die Verwendung von Reflection.Emit, um eine dynamische Methode zu erstellen: Darin verwenden Sie die Anweisung calli IL, um den Funktionszeiger direkt aufzurufen.

+0

Ich bekomme den Punkt in beiden Optionen nicht, wo der c-Zeiger in C# geht. Kannst du vielleicht ein Beispiel schreiben oder etwas aufklären? – Gobliins

+0

Eine andere Option wäre, aus dem systemeigenen Code eine bestimmte C# -Methode aufzurufen, die ein IntPtr-Objekt verwenden und Marshal.GetDelegateForFunctionPointer aufrufen würde. –

+0

hmm idk, wenn ich dich falsch verstehe. Aber ich möchte nicht eine Mono-Methode auf einen c-Funktionszeiger setzen. Ich möchte nur eine Mono-Methode mit einem Zeiger als Argument und Rückgabewert aufrufen. – Gobliins

0

Ich bin nicht genau sicher, was Sie hier zu fragen versuchen, aber this ist der einfachste Weg, einen Rückruf zu tun.

+0

wenn es funktionieren würde – Gobliins

+0

Ich habe nicht gesehen, dass Sie einen Link gepostet haben, weil auf meinem Bildschirm Farben ziemlich gleichmäßig aussehen. Nun, Ihr Link ruft c von Mono/C# (und ich habe das schon getan, aber), ich muss auf der anderen Seite Mono/C# von c aufrufen. – Gobliins

+0

Es macht genau das, was Sie wollen. Untersuche diese Quelle sehr genau. Es ruft einen Rückruf in den c-Code zurück, der wiederum in den C# -Code zurückruft. – supercheetah