[Mono-list] Can I call c# code from c code?

Miguel de Icaza miguel at novell.com
Wed Feb 14 14:43:26 EST 2007


Hello,

> I have a large C# project that runs under Windows and makes use of C-DLLs that have callbacks into the C# code.
> 
> I am trying to figure out if it's possible to port all of this to
> mono.  I understand how to call C code from C# and how to embed the
> mono runtime in C code, but I don't see a way to do what I need
> without embedding mono.

There is a simple way.    Lets say that your C code needs to call this
function in C#:

class Dingus { void DoDingus (int operation); }

So you define this in C#:

	delegate void MyCallback (int operation);

Then you create a delegate of this type:

	Dingus d = new Dingus ();
	MyCallback do_dingus_callback = new MyCallback (d.DoDingus);

So now you have a delegate that you can use to call DoDingus from C#
that would be:

	do_dingus_callback (10);

That would call `d.DoDingus' with the parameter 10. 

You are not limited to calling instance methods, it could be a static
method.

Now, you need to pass this delegate to the unmanaged world, like this:

	[DllImport ("...")]
	extern static void Native_Code_Do_Something (MyCallback cback);

	...

	Native_Code_Do_Something (do_dingus_callback)

In C, you then write:

typedef void (*callback)(int op)

void Native_Code_Do_Something (callback cb)
{
	cb (10);
}


Miguel


More information about the Mono-list mailing list