Назовите указатель функции C++ от c#

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

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

от c#?

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

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

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

18
задан Sam 18 March 2010 в 15:03
поделиться

2 ответа

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);
  }
}
17
ответ дан 30 November 2019 в 08:52
поделиться

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

delegate void MyCppFunc(IntPtr someObject);

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

csharpfuncptr(param);

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

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

4
ответ дан 30 November 2019 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: