Вызовите указатель на функцию c ++ из c # - PullRequest
18 голосов
/ 18 марта 2010

Можно ли вызвать статический указатель на функцию c (++) (не делегат), как это

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

из c #?

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

Мне нужно иметь возможность перезвонить из c # в некоторые старые классы c ++. C ++ управляется, но классы не являются ссылочными (пока).

До сих пор я не знал, как вызвать указатель на функцию c ++ из c #, возможно ли это?

Ответы [ 2 ]

17 голосов
/ 18 марта 2010

дтб прав. Вот более подробный пример для 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);
  }
}
4 голосов
/ 18 марта 2010

Взгляните на метод Marshal.GetDelegateForFunctionPointer .

delegate void MyCppFunc(IntPtr someObject);

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

csharpfuncptr(param);

Я не знаю, действительно ли это работает с вашим методом C ++, однако, как указано в документации MSDN:

Вы не можете использовать этот метод с указателями на функции, полученными через C ++

...