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

关于这一点的链接参阅 *:

  1. 链接1
  2. 链接2
    请去原博主查看更多细节。这里只是供我自己速阅, 感谢博主 Roboby's Home 的 资源。