调用带参数的方法时的本机回调错误

时间:2012-10-04 20:02:42

标签: c# c++ callback

我正在尝试使用以下代码对我的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函数中删除参数并调整代码(从委托和导出的函数中删除参数)时,它可以很好地工作。

1 个答案:

答案 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);

希望这有帮助。