[Mono-list] Re: Marshaling unmanaged structure
    Robert Jordan 
    robertj at gmx.net
       
    Mon Aug 29 03:56:24 EDT 2005
    
    
  
Javier Diaz wrote:
> Hey all
> 
> I have an unmanaged structure that looks like this:
> 
> ------------------------------
> typedef struct event_struct {
>   struct event_struct *next;
>     int type;
>     union {
>        struct ev_levels  levels;
>        struct ev_text text;
>        struct ev_call_state call;
>        struct ev_netstats  netstats;
>        struct ev_url url;
>        struct ev_video video;
>        struct ev_registration reg;
>     } ev;
> } event;
> ------------------------------
> 
> I don't know how to wrap this structure, I know that the only posible
> way us by using the attribute [StructLayout (LayoutKind.Explicit]]
> and the attribute [FieldOffset (..)]
> 
> the structures that are inside the union are easy to wrap, they look like this:
> ------------------------------
> struct iaxc_ev_levels {
>   float input;
>   float output;
> };
> ------------------------------
> 
> Any ideas?
The default marshaller cannot handle nested structs or unions.
You have to break the struct into something the framework
is able to handle:
[StructLayout (LayoutKind.Explicit)]
public struct event_struct
{
   [FieldOffset(0)] public IntPtr next;
   [FieldOffset(4)] public int type;
   // first union
   [FieldOffset(8)] public float input;
   [FieldOffset(12)] public float output;
   // next union ...
   [FieldOffset(8)] public ...
}
The "next" ptr must be manually marshalled using Marshal.PtrToStructure.
Rob
    
    
More information about the Mono-list
mailing list