[Mono-dev] Problem marshalling unions

David_Hudson at capgroup.com David_Hudson at capgroup.com
Thu Jan 19 14:54:24 EST 2006


Hi,

I am having a problem marshalling unions using mono 1.1.13.

If I have a C union like this

union MYUNION
{
    int number;
    double d;
}

According to the MSDN docs, I should marshal it like this

// Declares managed structures instead of unions.
[ StructLayout( LayoutKind.Explicit )]
public struct MyUnion
{
   [ FieldOffset( 0 )]
   public int i;
   [ FieldOffset( 0 )]
   public double d;
}

Note that the Fieldoffset is the same for both fields. I have verified that
this works fine under .NET 1.1.

When I run this under mono, I get this error

"Type MYUNION which has an [ExplicitLayout] attribute cannot have two
fields with the same offset."

This error comes from  \mono\metadata\marshal.c line 1353
if (((klass->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) ==
TYPE_ATTRIBUTE_EXPLICIT_LAYOUT) && (usize == 0))
                  g_error ("Type %s which has an [ExplicitLayout] attribute
cannot have two fields with the same offset.", mono_type_full_name
(&klass->byval_arg));

Is this check correct? For normal structs fieldoffsets should be different
but for unions they can be the same.

Thanks
Dave




More information about the Mono-devel-list mailing list