Подтвердить что ты не робот

Вызов функции С++ из С#

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

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

из С#?

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

Мне нужно иметь возможность обратного вызова из С# в некоторые старые классы С++. С++ управляется, но классы не являются классами ref (пока).

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

4b9b3361

Ответ 1

dtb является правильным. Вот более подробный пример для Marshal.GetDelegateForFunctionPointer. Он должен работать для вас.

В С++:

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

В С#:

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

Ответ 2

Посмотрите на метод Marshal.GetDelegateForFunctionPointer.

delegate void MyCppFunc(IntPtr someObject);

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

csharpfuncptr(param);

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

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