将委托作为方法指针传递

时间:2012-10-05 13:34:27

标签: c# c++-cli

我正在尝试将委托传递给c ++方法代码:

#pragma unmanaged
void login(char *uname, void (*cb)() )
{
  if ( strcmp(uname, "test")==0)
  {
      printf("Correct!\n");
      cb();
  }
  else
  {
      printf("False\n");
  }
}
#pragma managed
public ref class log
{
    public: delegate void successdelg();
    public: static void logme(String ^s, successdelg ^success)
    {
        login( (char*)(void*)Marshal::StringToHGlobalAnsi(s), success );
    }
};

但是我收到了这个错误:“错误C2664:'login':无法将参数2从'log :: successdelg ^'转换为'void(__ cdecl *)(void)'”

通常情况下,我可以通过传递没有任何委托给我的c ++函数的方法来跳转这个错误,但是我将它用作引用我的c#项目的库,它将方法从我的c#应用程序传递给c ++ dll。

1 个答案:

答案 0 :(得分:1)

使用Marshal.GetFunctionPointerForDelegate方法。在使用回调函数时,始终将委托实例传递给此方法,因为此函数调用不会为此委托添加引用计数器。