gpt4 book ai didi

c# - 调用带参数的方法时 native 回调错误

转载 作者:行者123 更新时间:2023-11-30 02:59:40 25 4
gpt4 key购买 nike

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

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 函数中删除参数并调整代码(从委托(delegate)和导出函数中删除参数)时,它工作得很好。

最佳答案

Post() 和 set() 将 __cdecl 作为调用约定,因此您可能必须指定它:

[DllImport("core.dll", CallingConvention=CallingConvention.Cdecl)]
public extern static void set(MyCallback cb);

您可能还需要为委托(delegate)执行此操作,具体取决于 Post() 的期望:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void MyCallback(int);

希望这对您有所帮助。

关于c# - 调用带参数的方法时 native 回调错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12734982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com