C# 向 C/C++ 库设置 回调函数指针 要注意调用约定方式
在文章中c# 设置 C++ 回调函数
中,作者说
C++中的回调函数必须用_stdcall标记,使用stdcall方式回调
举例而言,c/cpp 导出的函数多数以 __cdecl 形式,
typedef void(*Render)(double* data, BOOL* color);
当在 .Net 中,默认情况下假定任何委托的调用约定为"__stdcall"。在上边链接文章中,作者建议在写 C 库的时候, c/cpp 导出函数使用 "__stdcall" 的方式:
typedef void(__stdcall *Render)(double* data, BOOL* color);
但是,我们知道,我们的C lib 一般不宜采用这种形式,这个时候,我们通常采用与非托管代码导出函数相同的调用约定,即 "__cdecl", C# 中采用类似形式:
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void EKFRenderCallback(string data, string colors);
public class EKFLib
{
[DllImport("EKFLib.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern void SetRenderCallback(EKFRenderCallback render);
}
public void RenderCallback(string data, string color)
{
// rendering
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
EKFLib.SetRenderCallback(RenderCallback);
EKFLib.Init();
}
关于这一点的链接参阅 StackOverFlow: