[Mono-dev] Embedded Mono - Structures and internal C methods

Paolo Molaro lupus at ximian.com
Tue Oct 4 10:38:54 EDT 2005

On 10/04/05 Tony McGrath wrote:
> I have been trying, with little success, to work out how to pass a 
> struct from
> C# into a C routine that has been registered with mono_add_internal_call().
> Specifically, the struct has to be modified within the C routine and those
> changes need to be reflected back into the managed C# struct.
> I assumed, probably incorrectly, that the standard P/Invoke mechanisms
> would be appropriate, and with the C# code using a ref modifier it appears
> as if the structure is being sent into the C routine properly, but the 
> modified
> struct is not being copied back into the C# side at all.
> Is there any particular magic that is required with internal calls with 
> an embedded
> application to get the copy in/copy out mechanism to work correctly?

There is no magic involved. If you posted your sample code we could
easily spot the error you're making.
Did you have a look at mono/docs/internal-calls?

Anyway, assume the structure is like this:

typedef struct {
	int a;
	MonoString *b;
} MyStruct;

with the following C# representation:

[StructLayout (LayoutKind.Sequential)]
struct MyStruct {
	int a;
	string b;

and the following C# icall declaration:

	static extern void my_icall (ref MyStruct s);

The C-side of the icall must look like:

	void my_icall_impl (MyStruct *s) {
		// do something


lupus at debian.org                                     debian/rules
lupus at ximian.com                             Monkeys do it better

More information about the Mono-devel-list mailing list