Im using a C++ Library into a C# solution through the[DllImport("C:\\gaul-windows.dll", ...)]
attribute.
I need to use a function which some of its parameters are delegates, and the type it returns also has some delegates as fields.
Can I do this?
Im asking because I tried to do it using the struct
as the return type but then I got this exception: "Method's type signature is not PInvoke compatible"
So I changed it and try using the IntPtr as the return type but then I got this exception: Cannot marshal 'parameter #16': Generic types cannot be marshaled.
So first of all I want to know if that is even possible? to use this kind of function that way. If it is not possible how would I be able to use it?
EDIT
Function I need to use
[DllImport("C:\\gaul-windows.dll", SetLastError = true, CallingConvention = CallingConvention.Cdecl)] public extern static IntPtr ga_genesis_boolean(int population_size, int num_chromo, int len_chromo, GAgeneration_hook generation_hook, GAiteration_hook iteration_hook, GAdata_destructor data_destructor, GAdata_ref_incrementor data_ref_incrementor, GAevaluate evaluate, GAseed seed, GAadapt adapt, GAselect_one select_one, GAselect_two select_two, GAmutate mutate, GAcrossover crossover, GAreplace replace, int? userdata);
This is an example of one of the delegates
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate short GAselect_one( ref population pop, IntPtr mother);
Over Here you can get the whole class.
And finally this is my call to the function
var x = Gaul.ga_genesis_boolean(30, /* const int population_size */ vehicle_num, /* const int num_chromo */ order_num, /* const int len_chromo */ IntPtr.Zero,// null, /* GAgeneration_hook generation_hook */ null, /* GAiteration_hook iteration_hook */ null, /* GAdata_destructor data_destructor */ null, /* GAdata_ref_incrementor data_ref_incrementor */ new GAevaluate(darp_score),/* GAevaluate evaluate */ new GAseed(Gaul.ga_seed_boolean_random), /* GAseed seed */ null, /* GAadapt adapt */ new GAselect_one(Gaul.ga_select_one_bestof2),/* GAselect_one select_one */ new GAselect_two(Gaul.ga_select_two_bestof2),/* GAselect_two select_two */ new GAmutate(Gaul.ga_mutate_boolean_singlepoint), /* GAmutate mutate */ new GAcrossover(Gaul.ga_crossover_boolean_singlepoints), /* GAcrossover crossover */ null, /* GAreplace replace */ null /* vpointer User data */ );