tipos solo seguro realizar punteros puntero puede memoria ejemplos direccion con compila como codigo aparecer c# c++ function-pointers

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