Очередное непонимание или какая-то глупость.
C# вызывает функцию из неуправляемой С++ DLL передавая туда Callback функцию.
C#:
public delegate bool CallBack ();
public delegate bool CallBackX(int x);
[DllImport(_dllName, EntryPoint = "FtaDllDo", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]
public static unsafe extern int FtaDllInitModule ([MarshalAs(UnmanagedType.I4)] int ff, CallBack cbff, ref ZIInitModule st);
[DllImport(_dllName, EntryPoint = "FtaDllDoX", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]
public static unsafe extern int FtaDllInitModuleX([MarshalAs(UnmanagedType.I4)] int ff, CallBackX cbff, ref ZIInitModule st);
......
CallBack myCallBack = new CallBack (CBfunc);
CallBackX myCallBackX = new CallBackX(CBfuncX);
FtaDllInitModule (1, myCallBack, ref ist); Console.WriteLine("FtaDllInitModule\n");
FtaDllInitModuleX(1, myCallBackX, ref ist); Console.WriteLine("FtaDllInitModuleX\n");
......
public static bool CBfunc()
{
Console.Write("CBfunc !!!!\n\n");
return false;
}
public static bool CBfuncX(int x)
{
Console.Write("CBfuncX x={0} !!!!\n\n", x);
return false;
}
C++ *.h:
/////////////////////////////////////////////////////////////////////////////
extern "C"
{
__declspec(dllexport) int FtaDllDo (int ff, bool (*ffcb)(), void* vptr);
__declspec(dllexport) int FtaDllDoX(int ff, bool (*ffcb)(int x), void* vptr);
}
C++ *.cpp:
__declspec(dllexport) int FtaDllDo( int ff, bool (*ffcb)(), void* vptr )
{
int rc = 1;
bool rb = (*ffcb)();
return rc;
}
__declspec(dllexport) int FtaDllDoX( int ff, bool (*ffcb)(int x), void* vptr )
{
int rc = 1;
bool rb = (*ffcb)(5);
return rc;
}
Вызов FtaDllDo отрабатывает нормально, а FtaDllDoX - падает при возврате из ffcb.
Сообщает о несогласованности типов.
Наверное это касается int x.
Но я не смог найти примеров или описания - как задать маршалинг на параметры Callback функций. В приводимых примерах нет ничего подходящего.
Может быть ошибка и не здесь, но ГДЕ?
Буду рад любым зацепкам.
Спасибо.