Оберните функцию С++, которой нужен указатель функции

у меня есть внешняя dll (с документацией по C++ по ее использованию), и мне нужно использовать внутри нее некоторые функции из моей программы C#.

Я написал небольшую обертку для некоторых функций, и они работают хорошо, но я не знаю, как обернуть функции, которым нужен указатель на функцию в качестве параметра.

В документации С++ говорится:

uint NativeFunction(uint32 parameter, GenericFunction *func)

Поскольку GenericFunction должен получить 2 * char в качестве параметров, я написал это на С#:

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 источник


Ответы (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