[Mono-list] LayoutKind.Explicit marshaling problem

Dietmar Maurer dietmar@maurer-it.com
10 Jan 2003 17:21:15 +0100


I just committed a fix to CVS. Please can you test if it works for you?

- Dietmar

On Fri, 2003-01-10 at 14:34, J. Perkins wrote:
> I am having trouble wrapping the X11 XNextEvent() function with Mono.
> This problem appears to have been first reported by Everaldo Canuto
> back
> in September (http://makeashorterlink.com/?V60442903). I have not
> tried
> compiling X# but I assume it would have the same problem.
> 
> The assert fires when trying to build an equivalent to the XEvent
> class,
> which is a union of structures. Passing an XEvent to a DllImport
> causes
> an assertion in marshal.c. This is using the 2003-Jan-09 snapshot on a
> RH8 box. I could not find any mention of this problem in bugzilla,
> even
> though it was initially reported a few months ago. Is this a known
> problem? If not I will file a new bug. The assertion message and the
> sample code follows.
> 
> Note that removing the second member from XEvent causes the problem to
> disappear, it is the second [FieldOffset] that triggers the assert.
> 
> Jason
> 379
> 
> ** ERROR **: file marshal.c: line 803 (emit_struct_conv): assertion
> failed: (msize > 0 && usize > 0)
> 
> using System;
> using System.Runtime.InteropServices;
> 
> [StructLayout(LayoutKind.Sequential)]
> public struct XAnyEvent
> {
>         public int type;
> }
> 
> [StructLayout(LayoutKind.Sequential)]
> public struct XEventPadding
> {
>         int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z;
> }
> 
> [StructLayout(LayoutKind.Explicit)]
> public struct XEvent
> {
>         [FieldOffset(0)] public  XAnyEvent xany;
>         [FieldOffset(0)] private XEventPadding xpad;
> }
> 
> public class ExplicitBug
> {
>         [DllImport("X11")] 
>         static extern IntPtr XOpenDisplay(string name);
> 
>         [DllImport("X11")] 
>         static extern int XNextEvent(IntPtr dpy, out XEvent xevent);
>         
>         static void Main()
>         {
>                 IntPtr dpy = XOpenDisplay(null);
>                 
>                 XEvent evt = new XEvent();
>                 XNextEvent(dpy, out evt);
>         }
> }
> 
> 
> 
> 
> _______________________________________________
> Mono-list maillist  -  Mono-list@ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-list
>