solo - Llame al puntero de la función c++ desde c#
punteros en c# pdf (2)
Eche un vistazo al método Marshal.GetDelegateForFunctionPointer .
delegate void MyCppFunc(IntPtr someObject);
MyCppFunc csharpfuncptr =
(MyCppFunc)Marshal.GetDelegateForFunctionPointer(funcptr, typeof(MyCppFunc));
csharpfuncptr(param);
Sin embargo, no sé si esto realmente funciona con su método C ++, como indica la documentación de MSDN:
No puede utilizar este método con punteros de función obtenidos a través de C ++
¿Es posible llamar al puntero de la función estática ac (++) (no a un delegado) de esta manera?
typedef int (*MyCppFunc)(void* SomeObject);
desde C#?
void CallFromCSharp(MyCppFunc funcptr, IntPtr param)
{
funcptr(param);
}
Necesito poder devolver la llamada de c # a algunas clases antiguas de c ++. C ++ está administrado, pero las clases no son clases ref (todavía).
Hasta ahora no tengo idea de cómo llamar a un puntero de función c ++ desde c #, ¿es posible?
dtb tiene razón. Aquí un ejemplo más detallado para Marshal.GetDelegateForFunctionPointer. Debería funcionar para usted.
En 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ía#:
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);
}
}