[Mono-list] passing MonoArray from c#
Robert Jordan
robertj at gmx.net
Sun May 3 18:07:26 EDT 2009
>> Speaking of which, the moonlight code makes heavy use of delegates.. perhaps
>> because of performance? I tried to use a delegate to get the link data, but
>> the test
I don't know much about moolight, but yes, mono_runtime_invoke
is slower than a delegate call.
>>
>> retLinks = (*the_delegates.the_stringsfield_delegate)();
>>
>> crashes immediately on entry. Can you tell me if i'm doing something wrong?
You cannot call a managed delegate directly from unmanaged code,
unless the delegate was created with
Marshal.GetFunctionPointerForDelegate().
In turn, this method is creating a p/invoke wrapper which
can be pretty useless in embedded scenarios because it does
not allow objects in the signature.
A faster way to call managed method w/out having to
runtime_invoke them are managed thunks:
//
// your code that gets the MonoEmbed:getLinks method
//
desc = mono_method_desc_new("MonoEmbed:getLinks", TRUE);
method = mono_method_desc_search_in_image(desc,
mono_assembly_get_image (assembly));
mono_method_desc_free (desc);
//
// Define a function pointer type for MonoEmbed:getLinks.
// Notice the "this" argument and MonoException**.
//
typedef MonoArray* (*GetLinksMethod)(MonoObject*, MonoException**);
// optain thunk with mono_method_get_unmanaged_thunk
GetLinksMethod getLinksThunk =
(GetLinksMethod) mono_method_get_unmanaged_thunk (method);
// invoke the method
retLinks = getLinksThunk (instance, (MonoException**)&exc);
if (exc != NULL)
abort ();
// enjoy ;)
printf ("length: %d\n", mono_array_length (retLinks));
I can't believe I've still not documented this stuff
properly :-( You can find some docs in metadata/object.c.
Robert
More information about the Mono-list
mailing list