[Mono-list] passing MonoArray from c#

fozzie david_aiken at yahoo.com
Fri May 1 23:23:35 EDT 2009


This is the C# code which is called:

   
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Explicit)]
    [Serializable]
    public struct Data
    {
        [System.Runtime.InteropServices.FieldOffsetAttribute(0)]
        public int i;

        [System.Runtime.InteropServices.FieldOffsetAttribute(0)]
        public System.IntPtr s;

        [System.Runtime.InteropServices.FieldOffsetAttribute(0)]
        public float f;
    }

   
[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
    [Serializable]
    public struct Link
    {
        public int type;
        public Data data;
    }

    public enum DataType { DT_Int = 0, DT_String = 1, DT_Float = 2 };

    public class Widget : Controller
    {
        public override Link[] Pack(System.UInt32 packFlags)
        {
            Link[] links = new Link[2];
            links[0].type = (int)DataType.DT_Float;
            links[0].data.f = mMass;
            links[1].type = (int)DataType.DT_String;
            links[1].data.s = mName;

            return links; // TBD is this valid until the C++ side is done
with it?
        }

        public override object Invoke(string methodName, object[]
parameters)
        {
            return this.GetType().InvokeMember(methodName,
BindingFlags.InvokeMethod, null, this, parameters);
        }
    }

This is the calling C++ code.. the debugger output shows that the
Widget:Pack call gets the packFlags parameter correctly and exits:

        typedef enum {DT_Int = 0, DT_String = 1, DT_Float = 2} DataType; //
has to match type in Controllers.cs

        typedef union 
        {
            int i;
            WCHAR *s;
            float f;
        }Data;

        typedef struct
        {
            int type;
            Data data;
        }DataLink;

        MonoArray *args = mono_array_new(domain, mono_get_object_class(),
1);
        MonoObject *result = mono_value_box (domain, mono_get_uint32_class
(), &packFlags);
        mono_array_setref (args, 0, result);
        MonoObject *retVal = mMonoClass->invoke("Pack", args);
        MonoArray *retLinks = (MonoArray *)mono_object_unbox(retVal);

,,,
        gpointer
        mono_object_unbox (MonoObject *obj)
        {
        	/* add assert for valuetypes? */
        	g_assert (obj->vtable->klass->valuetype);
        	return ((char*)obj) + sizeof (MonoObject);
        }

Unfortunately the assert is triggered since valuetype is 0. I'm not sure
that i'm handling the WCHAR*/IntPtr properly, but it seems there is another
issue. Any help appreciated!
-- 
View this message in context: http://www.nabble.com/passing-MonoArray-from-c--tp23341741p23342751.html
Sent from the Mono - General mailing list archive at Nabble.com.



More information about the Mono-list mailing list