PInvoke C #: функция принимает указатель на функцию в качестве аргумента - PullRequest
10 голосов
/ 08 марта 2011

Я хотел бы получить доступ к этой функции в моем коде c #, возможно ли это? таким образом, в конце код c ++ вызовет мою функцию, а также применит структуру, называемую «sFrameofData».

C ++ Код:

//The user supplied function will be called whenever a frame of data arrives.
DLL int Cortex_SetDataHandlerFunc(void (*MyFunction)(sFrameOfData* pFrameOfData));

Возможно, это сработает?

C # код:

[DllImport("Cortex_SDK.dll")]
public extern static int Cortex_SetDataHandlerFunc(ref IntPtr function(ref IntPtr pFrameOfData) );

Ответы [ 2 ]

29 голосов
/ 08 марта 2011

Вы хотите использовать делегата, который соответствует сигнатуре метода вашего метода "MyFunction" C ++.

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void MyFunctionDelegate(IntPtr frame);

[DllImport("Cortex_SDK.dll")]
public extern static int Cortex_SetDataHandlerFunc(
[MarshalAs(UnmanagedType.FunctionPtr)]MyFunctionDelegate functionCallback);
1 голос
/ 08 марта 2011

Я не уверен, что это правильный путь, но я не думаю, что достаточно использовать ref IntPtr для функций и структур ...

см. Здесь некоторую помощь: C # P / Invoke: Разметка структур, содержащих указатели на функции

...