2010-03-18 15 views
17

E 'possibile chiamare un c (++) puntatore a funzione statica (non un delegato) come questoChiama C++ puntatore a funzione da C#

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

da C#?

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

Devo essere in grado di richiamare da C# in alcune vecchie classi C++. C++ è gestito, ma le classi non sono classi ref (ancora).

Finora non ho idea di come chiamare un puntatore di funzione C++ da C#, è possibile?

+0

penso che la soluzione migliore è quella di creare un C++/CLI wrapper per questo. – Anzurio

+0

Questo ha funzionato per me, https://stackoverflow.com/questions/39790977/how-to-pass-a-delegate-or-function-pointer-from-c-sharp-to-c-and-call-it- lì/39803574 # 39803574 –

risposta

16

dtb ha ragione. Ecco un esempio più dettagliato per Marshal.GetDelegateForFunctionPointer. Dovrebbe funzionare per te.

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

In 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

Dai un'occhiata al metodo Marshal.GetDelegateForFunctionPointer.

delegate void MyCppFunc(IntPtr someObject); 

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

csharpfuncptr(param); 

Non so se questo funziona davvero con il C++ metodo, anche se, come la documentazione MSDN afferma:

Non è possibile utilizzare questo metodo con puntatori a funzione ottenuti tramite C++

+1

La descrizione dice: "Non è possibile utilizzare questo metodo con i puntatori di funzione ottenuti tramite C++" - purtroppo, il mio puntatore di funzione è un puntatore C++. – Sam

+1

Quindi, la tua unica opzione è, credo, per creare classi wrapper gestite (ref) in C++ per la tua libreria C++. – dtb