2010-03-18 24 views
17

¿Es posible llamar a un c (++) función estática puntero (no un delegado) como estoLlamar C++ puntero de función de C#

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

de C#?

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

Necesito poder hacer una devolución de llamada desde C# en algunas clases antiguas de C++. C++ es administrado, pero las clases no son clases ref (aún).

Hasta ahora no tengo idea de cómo llamar a un puntero de función C++ desde C#, ¿es posible?

+0

creo que la mejor opción es crear un C++/CLI envoltorio para eso. – Anzurio

+0

Esto funcionó para mí, https://stackoverflow.com/questions/39790977/how-to-pass-a-delegate-or-function-pointer-from-c-sharp-to-c-and-call-it- allí/39803574 # 39803574 –

Respuesta

16

dtb es correcto. 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)); 
} 

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

Eche un vistazo al método Marshal.GetDelegateForFunctionPointer.

delegate void MyCppFunc(IntPtr someObject); 

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

csharpfuncptr(param); 

No sé si esto realmente funciona con el método C++, sin embargo, como la documentación de MSDN indica:

No puede utilizar este método con los punteros de función obtenidos a C++

+1

La descripción dice: "No se puede usar este método con los punteros de función obtenidos a través de C++". Desafortunadamente, mi puntero de función es un puntero de C++. – Sam

+1

Entonces su única opción es, supongo, crear clases de contenedor gestionado (ref) en C++ para su biblioteca C++. – dtb

Cuestiones relacionadas