[Mono-list] [embedding] "moving from mono_runtime_invoke() to mono_method_get_unmanaged_thunk()" or "how to call class method that takes and returns a string via thunks"

Rodrigo Kumpera kumpera at gmail.com
Wed Nov 11 20:34:55 UTC 2015


How does it crash? Did you try debugging it?

The invocation looks ok.

On Wed, Nov 11, 2015 at 3:03 PM, Core_Code <julian at corecode.at> wrote:

> hello,
>
> we are currently embedding Mono to use a C# DLL, which works fine.
>
> we are using mono_runtime_invoke() to invoke a class method and are
> obtaining the resulting object just fine.
>
> however, for performance reasons we'd like to switch to using the
> 'unmanaged
> thunks', which we did not get to work. our call differes from the example
> in
> the 'embedding mono' docs by the parameters and the fact that we are
> calling
> a class method. however we try, just different crashes.
>
>
> the function we have to call has this prototype:
> public static string ParseToJSON(string input)
>
> which seems to translate to a mono method description of
> XLParser.ExcelFormulaParser:ParseToJSON (string)
>
> we have no problem using mono_runtime_invoke() to call it exactly like
> this:
>
>
> MonoAssembly *assembly = mono_domain_assembly_open(domain,
> "/path/to/XLParser.dll");
> MonoImage *image = mono_assembly_get_image(assembly);
> MonoClass *classHandle = mono_class_from_name(image, "XLParser",
> "ExcelFormulaParser");
> const char *descAsString = "XLParser.ExcelFormulaParser:ParseToJSON
> (string)";
> MonoMethodDesc *description = mono_method_desc_new(descAsString, 0);
> method = mono_method_desc_search_in_class(description, classHandle);
> void *args[1] = {mono_string_new (domain, "A+B")};
> MonoObject *resultObject = mono_runtime_invoke(method, NULL, args, NULL);
> MonoString *resultString = mono_object_to_string(resultObject, NULL);
> char *resultCString = mono_string_to_utf8(resultString);
>
>
> now we are trying the thunk method:
>
> typedef MonoObject* (*ParseToJSON) (MonoString *obj1,MonoString *obj2);
> ParseToJSON func = mono_method_get_unmanaged_thunk(method);
> MonoString *s = mono_string_new (domain, "A+B");
> MonoObject *result = func(s,NULL);
> MonoString *resultstring = mono_object_to_string(result, NULL);
> char *str = mono_string_to_utf8(resultstring);
>
> but it crashes - any idea how to call a class method via thunks?
>
>
>
>
> --
> View this message in context:
> http://mono.1490590.n4.nabble.com/embedding-moving-from-mono-runtime-invoke-to-mono-method-get-unmanaged-thunk-or-how-to-call-class-me-tp4666935.html
> Sent from the Mono - General mailing list archive at Nabble.com.
> _______________________________________________
> Mono-list maillist  -  Mono-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-list
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ximian.com/pipermail/mono-list/attachments/20151111/8c4ab8b9/attachment.html>


More information about the Mono-list mailing list