I have the following setup in C#:
public delegate void CallbackDelegate(string message);
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public static extern void setCallback(CallbackDelegate aCallback);
public void testCallbacks()
{
System.Console.Write("Registering C# callback...\n");
setCallback(callback01);
}
public void callback01(string message)
{
System.Console.Write("callback 01 called: " + message + "\n");
}
And this in C++ (the function is registered correctly via mono_add_internal_call ):
typedef void (*CallbackFunction)(const char*);
void setCallback(MonoDelegate* delegate)
{
// How to convert the MonoDelegate to a proper function pointer?
// So that I can call it like func("test");
}
The C++-function is called and something is passed to the delegate variable. But what now?
I looked around and found the function "mono_delegate_to_ftnptr" mentioned a few times, and from those examples it seems to be exactly what I need.
However, this function simply does not seem to exist in my distribution of mono (4.6), so I can only guess it does not exist any more.
I also found a few examples of how to do this with PInvoke. Which is something I do not want to use - since InternalCall is much faster for my purpose.
Of course, if PInvoke would be the only way, so be it, but I doubt that.
In the end, I am really at a loss at how to proceed from here.
setCallback(System::Action<System::String^>^ delegate)
to directly accept a .NET delegate that directly receives a .NET string. Perhaps if you showed how InternalCall functions are passed .NET reference types in Mono, it could lead to a lighterweight solution. – Denni