从c#调用c ++函数指针

时间:2010-03-18 14:19:34

标签: c# c++ function-pointers

是否可以像这样调用c(++)静态函数指针(不是委托)

typedef int (*MyCppFunc)(void* SomeObject);

来自c#?

void CallFromCSharp(MyCppFunc funcptr, IntPtr param)
{
  funcptr(param);
}

我需要能够从c#回调到一些旧的c ++类。 C ++是受管理的,但这些类不是ref类(还)。

到目前为止,我不知道如何从c#调用c ++函数指针,是否可能?

2 个答案:

答案 0 :(得分:17)

dtb是对的。这里是Marshal.GetDelegateForFunctionPointer的更详细示例。它应该适合你。

在C ++中:

static int __stdcall SomeFunction(void* someObject, void*  someParam)
{
  CSomeClass* o = (CSomeClass*)someObject;
  return o->MemberFunction(someParam);
}

int main()
{
  CSomeClass o;
  void* p = 0;
  CSharp::Function(System::IntPtr(SomeFunction), System::IntPtr(&o), System::IntPtr(p));
}

在C#中:

public class CSharp
{
  delegate int CFuncDelegate(IntPtr Obj, IntPtr Arg);
  public static void Function(IntPtr CFunc, IntPtr Obj, IntPtr Arg)
  {
    CFuncDelegate func = (CFuncDelegate)Marshal.GetDelegateForFunctionPointer(CFunc, typeof(CFuncDelegate));
    int rc = func(Obj, Arg);
  }
}

答案 1 :(得分:4)

查看Marshal.GetDelegateForFunctionPointer方法。

delegate void MyCppFunc(IntPtr someObject);

MyCppFunc csharpfuncptr =
    (MyCppFunc)Marshal.GetDelegateForFunctionPointer(funcptr, typeof(MyCppFunc));

csharpfuncptr(param);

我不知道这是否真的适用于您的C ++方法,但是,正如MSDN文档所述:

  

你不能将这个方法用于通过C ++获得的函数指针