Обвийте c++ функция, която се нуждае от указател на функция

имам външен dll (с C++ документация за това как да го използвам) и трябва да използвам някои функции вътре в него от моята C# програма.

Написах малка обвивка за някои функции и те работят добре, но не знам как да обвивам функции, които се нуждаят от указател на функция като параметър.

C++ документацията казва:

uint NativeFunction(uint32 parameter, GenericFunction *func)

Тъй като GenericFunction трябва да получи 2 *char като параметри, написах това на C#:

public struct GenericFunction 
{
    public string param1;
    public string param2;
}

[DllImport("externalLib.dll", SetLastError = true)]
public static extern uint NativeFunction(uint parameter, GenericFunction func);

И когато трябва да го извикам, използвам

GenericFunction test = new GenericFunction();
uint result = NativeFunction(0u, test);

с това имам тази грозна грешка:

Опит за четене или запис на защитена памет. Това често е индикация, че друга памет е повредена.

Почти съм сигурен, че извиквам функцията по грешен начин, тъй като все още трябва да дефинирам какво прави GenericFunction, но нямам представа как да го направя и google не ми помага този път!


person HypeZ    schedule 30.09.2014    source източник
comment
възможен дубликат на PInvoke C#: Функцията взема указател, за да функционира като аргумент   -  person clcto    schedule 30.09.2014
comment
Тъй като не знаех как да предам указател на функция като параметър, така че структурата изглеждаше добре! Мисля, че въпросът, маркиран като дубликат, наистина може да реши проблема ми, правя някакъв тест   -  person HypeZ    schedule 30.09.2014


Отговори (1)


Можете да използвате делегати вместо указател на функция.

public delegate void GenericFunction(string param1, string param2);

[DllImport("externalLib.dll", SetLastError = true)]
public static extern uint NativeFunction(uint parameter, [MarshalAs(UnmanagedType.FunctionPtr)]GenericFunction func);
person jbriggs    schedule 30.09.2014
comment
това изглежда добре, но как мога да дефинирам какво прави GenericFunction? Трябва да декларирам с нещо като делегат? - person HypeZ; 30.09.2014
comment
@HypeZ Точно както бихте използвали други делегати. Създайте функция със същия подпис и предайте името на тази функция на NativeFunction - person clcto; 30.09.2014