[Mono-dev] Seeking advice on converting basic value types from the CLR representation to native C types, using mono embedding

Jean-Michel.Perraud at csiro.au Jean-Michel.Perraud at csiro.au
Thu Oct 11 02:45:11 UTC 2012


Hi,



I am working on a package to access the Mono (resp. MS.NET) CLR from the R statistical language. I am trying to convert 'simple' CLR value types (e.g. string, double, bool, DateTime) to marshall them to their R equivalent. I managed to deal with the 'bool', but stumbled on the DateTime



I think Mono's print_field_value in debug-helpers.c seems the closest I can infer from, to mimic it. But I have trouble doing so. I understand little of what I get returned from mono_object_unbox. Any guidance on how to go about it is welcome. In return, I'd like to contribute some 'howto' documentation to Mono.



The task is logged at http://r2clr.codeplex.com/workitem/14 for background info.

You can get the complete source code from http://r2clr.codeplex.com if you wish, but I include below code that should convey the idea.



Regards,

J-M



//snip

type_il = mono_type_get_type(mono_class_get_type(mono_object_get_class(pobj)));

switch(type_il)  /*MonoTypeEnum*/ {

case MONO_TYPE_R8             :

      result = mkNumericSexp(1, (double*)mono_object_unbox(pobj));

      break;

case MONO_TYPE_STRING         :

      str = mono_string_to_utf8((MonoString*)pobj); // this one should work; yet to pass formal unit test.

      result = mkCharSexp(1, &str);

      mono_free(str);

      break;

case MONO_TYPE_BOOLEAN        : // this one seems to work

      result = mkBoolSexp(1, (int*)mono_object_unbox (pobj));

      break;

case MONO_TYPE_VALUETYPE    :

      {

            if(strcmp( klassName, "DateTime") == 0)

            {

                  double * valSinceNinteenhunds = getRDateOffset(pobj); // this seems very off.

                  result = mkDateSexp(1, valSinceNinteenhunds);

                  break;

            }

      }

//snip



double * getRDateOffset(CLR_OBJ * pobj) {

      MonoMethod * method = rclr_mono_get_method( spTypeClrFacade, "GetRDateDoubleRepresentation", 1); // C# GetRDateDoubleRepresentation returns a double, a TimeSpan.TotalDays

      void ** params = (void**) &(pobj);

      MonoObject * exception;

      // FIXME: seems I should seek gint64; Where is it defined in the mono distribution include headers? seems absent from glib.h and anywhere else.

      return (double*)mono_object_unbox(mono_runtime_invoke(method, NULL, params, &exception)); }





-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ximian.com/pipermail/mono-devel-list/attachments/20121011/1a3a13cd/attachment.html>


More information about the Mono-devel-list mailing list