开发者

Call c++ function pointer from c#

开发者 https://www.devze.com 2022-12-23 02:59 出处:网络
Is 开发者_高级运维it possible to call a c(++) static function pointer (not a delegate) like this

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?


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


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++

0

精彩评论

暂无评论...
验证码 换一张
取 消