Portar estructura C a C #

Estoy portando el código C a C # y tengo algunas dudas.

Considera esta estructura:

typedef struct { uint32_t w; uint32_t h; uint32_t f_cc; uint32_t st; unsigned char *pl[4]; int32_t strd[4]; void (*done)(void *thisobj); void *e_cc; uint32_t rsrvd2; uint32_t rsrvd3; } f_tt; 

He hecho esto y no funciona (probablemente porque está mal: – /):

 [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct f_tt { public uint w; public uint h; public uint f_cc; public uint st; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public Byte[] pl; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public int[] strd; public delegate void done(IntPtr thisobj); public delegate void e_cc(); public uint rsrvd2; public uint rsrvd3; } 

¿Alguien puede aconsejarme cómo hacer esto ic #?

  void (*done)(void *thisobj); void *e_cc; 

¡Gracias!

Antes de llegar a los delegates, sospecho que está equivocado al empaquetar la estructura. Es muy inusual hacerlo. Solo hazlo si encuentras el paquete #pragma en el código C.

El campo e_cc no es un puntero a función. Es sólo un puntero vacío. En C # que es IntPtr .

El miembro pl es una matriz de 4 punteros. No estoy muy seguro de lo que contienen, pero seguro que puedes hacer que esto sea así:

 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public IntPtr[] pl; 

Eso te deja con la intervención manual para rellenar la matriz o leer su contenido. Es posible que lo pueda hacer el comisario, pero sin conocer la semántica de la interoperabilidad, no puedo decir cómo hacerlo.

En cuanto a done , debe declarar al delegado fuera de la estructura. Me gusta esto:

 [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void doneDelegate(IntPtr thisobj); 

Aquí estoy asumiendo que la convención de llamada es cdecl ya que no hay nada en el código C para decir lo contrario.

Poniéndolo todo junto tienes:

 [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void doneFunc(IntPtr thisobj); [StructLayout(LayoutKind.Sequential)] public struct f_tt { public uint w; public uint h; public uint f_cc; public uint st; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public IntPtr[] pl; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public int[] strd; public doneDelegate done; public IntPtr e_cc; public uint rsrvd2; public uint rsrvd3; }