Я использую библиотеку C ++ в решение C # через
[DllImport("C:\\gaul-windows.dll", ...)]
приписывать.
Мне нужно использовать функцию, некоторые из параметров которой являются делегатами, а тип, который она возвращает, также имеет несколько делегатов в качестве полей.
Я могу это сделать?
Я спрашиваю, потому что я пытался сделать это с помощью struct
как тип возвращаемого значения, но затем я получил это исключение: «Подпись типа метода не совместима с PInvoke»
Поэтому я изменил его и попытался использовать IntPtr в качестве возвращаемого типа, но затем я получил это исключение: Cannot marshal ‘параметр # 16’: универсальные типы нельзя маршалировать.
Итак, прежде всего я хочу знать, возможно ли это вообще? использовать эту функцию таким образом. Если это невозможно, как я смогу использовать его?
РЕДАКТИРОВАТЬ
Функция мне нужно использовать
[DllImport ( "C: \\ галл-windows.dll", SetLastError = true, CallingConvention = CallingConvention.Cdecl)] public extern static IntPtr ga_genesis_boolean (int pop_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 оценить, GAseed семян, GAadapt адаптироваться, GAselect_one select_one, GAselect_two select_two, GAmutate мутировать, GA кроссовер кроссовер, GA заменить место, Int? данные пользователя);
Это пример одного из делегатов
[UnmanagedFunctionPointer (CallingConvention.Cdecl)] открытый делегат короткий GAselect_one ( Ref Pop Pop, IntPtr мать);
Над Вот Вы можете получить весь класс.
И, наконец, это мой вызов функции
var x = Gaul.ga_genesis_boolean (30, / * const int население_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 * / новая оценка GAevaluate (darp_score), / * оценка GAevaluate * / новый GAseed (Gaul.ga_seed_boolean_random), / * GAseed seed * / null, / * GAadapt adapt * / новый GAselect_one (Gaul.ga_select_one_bestof2), / * GAselect_one select_one * / новый GAselect_two (Gaul.ga_select_two_bestof2), / * GAselect_two select_two * / новый GAmutate (Gaul.ga_mutate_boolean_singlepoint), / * GAmutate mutate * / новый GAcrossover (Gaul.ga_crossover_boolean_singlepoints), / * GAcrossover * / null, / * GA заменяет * / null / * vpointer Данные пользователя * / );
Да, вы можете использовать библиотечную функцию C ++, когда некоторые ее параметры являются делегированными.
Ошибка, которую я получаю, «Cannot marshal», параметр # 16: «Универсальные типы нельзя маршалировать». был не о параметрах делегата, а обнуляемое целое число.
DllImportAttribute
может применяться только к определениям методов. Это определение метода определяет сигнатуру встроенной функции, которая объявлена в DLL. Это означает, что метод должен быть глобальной функцией (и экспортированной) и не поддерживает функции класса.
Вы не можете использовать DllImportAttribute
на определения типа, такие как структура и класс.
Если вы хотите импортировать методы из DLL, которые не являются глобальными функциями, вам придется создать глобальные функции, чтобы обернуть то, что вы хотите импортировать.