1

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

4

1 回答 1

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

希望这可以帮助。

于 2012-10-04T20:12:13.550 回答