Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用带有参数的方法时发生本机回调错误_C#_C++_Callback - Fatal编程技术网

C# 调用带有参数的方法时发生本机回调错误

C# 调用带有参数的方法时发生本机回调错误,c#,c++,callback,C#,C++,Callback,我正在尝试使用以下代码对我的C#应用程序执行一些本机回调: C#: C++: 当我执行此代码时,在执行callmemaybe方法之后,我得到以下错误: '未在函数调用中正确保存ESP的值。这通常是使用一个调用对流声明的函数调用另一个调用对流声明的函数指针的结果 但是,当我从callmemaybe函数中删除参数并调整代码(从委托和导出的函数中删除参数)时,它工作得非常好。Post()和set()将_cdecl作为它们的调用转换,因此您可能必须指定它: [DllImport("core.dll",

我正在尝试使用以下代码对我的C#应用程序执行一些本机回调:

C#:

C++:

当我执行此代码时,在执行callmemaybe方法之后,我得到以下错误: '未在函数调用中正确保存ESP的值。这通常是使用一个调用对流声明的函数调用另一个调用对流声明的函数指针的结果

但是,当我从callmemaybe函数中删除参数并调整代码(从委托和导出的函数中删除参数)时,它工作得非常好。

Post()和set()将_cdecl作为它们的调用转换,因此您可能必须指定它:

[DllImport("core.dll", CallingConvention=CallingConvention.Cdecl)]
public extern static void set(MyCallback cb);
您可能还需要为委托执行此操作,具体取决于Post()的期望:

希望这能有所帮助。

我还要注意,C#interop调用默认为u stdcall,这就是为什么需要指定u cdecl的原因+1.
void (*callback)(int) ;
extern "C" __declspec(dllexport) void __cdecl set( void (*cb)(int)  )
{
callback = cb;
}
extern "C" __declspec(dllexport) void __cdecl  Post()
{
callback(1);
}
[DllImport("core.dll", CallingConvention=CallingConvention.Cdecl)]
public extern static void set(MyCallback cb);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void MyCallback(int);