<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 12 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:10.5pt;
        font-family:Consolas;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:Consolas;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-AU link=blue vlink=purple><div class=WordSection1><p class=MsoPlainText>Hi,<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>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<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>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.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>The task is logged at <a href="http://r2clr.codeplex.com/workitem/14">http://r2clr.codeplex.com/workitem/14</a> for background info.<o:p></o:p></p><p class=MsoPlainText>You can get the complete source code from <a href="http://r2clr.codeplex.com">http://r2clr.codeplex.com</a> if you wish, but I include below code that should convey the idea.<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>Regards,<o:p></o:p></p><p class=MsoPlainText>J-M<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>//snip<o:p></o:p></p><p class=MsoPlainText>type_il = mono_type_get_type(mono_class_get_type(mono_object_get_class(pobj)));<o:p></o:p></p><p class=MsoPlainText>switch(type_il)  /*MonoTypeEnum*/ {<o:p></o:p></p><p class=MsoPlainText>case MONO_TYPE_R8             :<o:p></o:p></p><p class=MsoPlainText>      result = mkNumericSexp(1, (double*)mono_object_unbox(pobj));<o:p></o:p></p><p class=MsoPlainText>      break;<o:p></o:p></p><p class=MsoPlainText>case MONO_TYPE_STRING         :<o:p></o:p></p><p class=MsoPlainText>      str = mono_string_to_utf8((MonoString*)pobj); // this one should work; yet to pass formal unit test.<o:p></o:p></p><p class=MsoPlainText>      result = mkCharSexp(1, &str);<o:p></o:p></p><p class=MsoPlainText>      mono_free(str);<o:p></o:p></p><p class=MsoPlainText>      break;<o:p></o:p></p><p class=MsoPlainText>case MONO_TYPE_BOOLEAN        : // this one seems to work<o:p></o:p></p><p class=MsoPlainText>      result = mkBoolSexp(1, (int*)mono_object_unbox (pobj));<o:p></o:p></p><p class=MsoPlainText>      break;<o:p></o:p></p><p class=MsoPlainText>case MONO_TYPE_VALUETYPE    :<o:p></o:p></p><p class=MsoPlainText>      {<o:p></o:p></p><p class=MsoPlainText>            if(strcmp( klassName, "DateTime") == 0)<o:p></o:p></p><p class=MsoPlainText>            {<o:p></o:p></p><p class=MsoPlainText>                  double * valSinceNinteenhunds = getRDateOffset(pobj); // this seems very off.<o:p></o:p></p><p class=MsoPlainText>                  result = mkDateSexp(1, valSinceNinteenhunds);<o:p></o:p></p><p class=MsoPlainText>                  break;<o:p></o:p></p><p class=MsoPlainText>            }<o:p></o:p></p><p class=MsoPlainText>      }<o:p></o:p></p><p class=MsoPlainText>//snip<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>double * getRDateOffset(CLR_OBJ * pobj) {<o:p></o:p></p><p class=MsoPlainText>      MonoMethod * method = rclr_mono_get_method( spTypeClrFacade, "GetRDateDoubleRepresentation", 1); // C# GetRDateDoubleRepresentation returns a double, a TimeSpan.TotalDays<o:p></o:p></p><p class=MsoPlainText>      void ** params = (void**) &(pobj);<o:p></o:p></p><p class=MsoPlainText>      MonoObject * exception;<o:p></o:p></p><p class=MsoPlainText>      // FIXME: seems I should seek gint64; Where is it defined in the mono distribution include headers? seems absent from glib.h and anywhere else.<o:p></o:p></p><p class=MsoPlainText>      return (double*)mono_object_unbox(mono_runtime_invoke(method, NULL, params, &exception)); }<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>