Возможно использовать «библиотечную функцию C ++» в C #, когда некоторые из его параметров являются делегатами?

Я использую библиотеку 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 Данные пользователя * /
);

2

Решение

Да, вы можете использовать библиотечную функцию C ++, когда некоторые ее параметры являются делегированными.

Ошибка, которую я получаю, «Cannot marshal», параметр # 16: «Универсальные типы нельзя маршалировать». был не о параметрах делегата, а обнуляемое целое число.

1

Другие решения

DllImportAttribute может применяться только к определениям методов. Это определение метода определяет сигнатуру встроенной функции, которая объявлена ​​в DLL. Это означает, что метод должен быть глобальной функцией (и экспортированной) и не поддерживает функции класса.

Вы не можете использовать DllImportAttribute на определения типа, такие как структура и класс.

Если вы хотите импортировать методы из DLL, которые не являются глобальными функциями, вам придется создать глобальные функции, чтобы обернуть то, что вы хотите импортировать.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector