private delegate void GFunc (IntPtr data, string[] user_data); [DllImport("glib-2.0")] static extern void g_slist_foreach (IntPtr slist, GFunc foreach_callback, ref IntPtr user_data); [DllImport("glib-2.0")] static extern int g_slist_length (IntPtr slist); private static void foreach_callback (IntPtr data, string[] user_data) { user_data [user_data.Length] = GLib.Marshaller.PtrToStringGFree (data); } [DllImport("ecal")] static extern unsafe IntPtr e_cal_get_events_from_source(IntPtr source, int type, out IntPtr error); public static string[] GetEventsFromSource(object source, object type) { GFunc handle_foreach; object ret; IntPtr error = IntPtr.Zero; IntPtr raw_ret = (IntPtr.Zero); //= e_cal_get_events_from_source(source.Handle, (int) type, out error); ret = new String [g_slist_length (raw_ret)]; handle_foreach = new GFunc (foreach_callback); IntPtr o = (IntPtr) ret; g_slist_foreach (raw_ret, handle_foreach, ref o); if (error != IntPtr.Zero) throw new GLib.GException (error); return ret as string []; }