我正在尝试使用以下代码对我的C#应用程序进行一些本机回调:
C#:
public delegate void MyCallback(int i );
[DllImport("core.dll")]
public extern static void set(MyCallback cb);
public static void callmemaybe(int i)
{
Console.Write(i);
}
[DllImport("lgcoree.dll")]
public extern static void Post();
static void Main()
{
set(callmemaybe);
Post();
}
C ++:
void (*callback)(int) ;
extern "C" __declspec(dllexport) void __cdecl set( void (*cb)(int) )
{
callback = cb;
}
extern "C" __declspec(dllexport) void __cdecl Post()
{
callback(1);
}
当我执行此代码时,在执行callmemaybe方法之后,我收到此错误: '在函数调用中没有正确保存ESP的值。这通常是调用使用一个调用对流声明的函数的结果,函数指针用不同的调用对流声明'
但是当我从callmemaybe函数中删除参数并调整代码(从委托和导出的函数中删除参数)时,它可以很好地工作。
答案 0 :(得分:3)
Post()和set()将__cdecl作为其调用对话,因此您必须指定它:
[DllImport("core.dll", CallingConvention=CallingConvention.Cdecl)]
public extern static void set(MyCallback cb);
您可能需要为委托进行此操作,具体取决于Post()所期望的内容:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void MyCallback(int);
希望这有帮助。