views:

542

answers:

2

Is it possible to call a c(++) static function pointer (not a delegate) like this

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

from c#?

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

I need to be able to callback from c# into some old c++ classes. C++ is managed, but the classes are not ref classes (yet).

So far I got no idea how to call a c++ function pointer from c#, is it possible?

+1  A: 

Have a look at the Marshal.GetDelegateForFunctionPointer method.

delegate void MyCppFunc(IntPtr someObject);

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

csharpfuncptr(param);

I don't know if this really works with your C++ method, though, as the MSDN documentation states:

You cannot use this method with function pointers obtained through C++

dtb
The description says: "You cannot use this method with function pointers obtained through C++" - sadly, my function pointer is a c++ pointer.
Sam
Then your only option is, I guess, to create managed (ref) wrapper classes in C++ for your C++ library.
dtb
+2  A: 

dtb is right. Here a more detailed example for Marshal.GetDelegateForFunctionPointer. It should work for you.

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

In 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);
  }
}
Lars