Вызов функции С++ из С#
Можно ли вызвать указатель статической функции c (++) (не делегат), подобный этому
typedef int (*MyCppFunc)(void* SomeObject);
из С#?
void CallFromCSharp(MyCppFunc funcptr, IntPtr param)
{
funcptr(param);
}
Мне нужно иметь возможность обратного вызова из С# в некоторые старые классы С++. С++ управляется, но классы не являются классами ref (пока).
До сих пор я понятия не имел, как вызвать указатель на функцию С++ из С#, возможно ли это?
Ответы
Ответ 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 гласит:
Вы не можете использовать этот метод с указателями функций, полученными с помощью С++