2011-07-06 27 views
6

(duplicado completo de http://old.nabble.com/C%2B%2B-pointer-to-method-as-parameter-to-C--td17645155.html, pero no pudo hacer el trabajo de macro propuesta)delegados en el TRAGO - C#

que tengo la siguiente función en C++ (simplificado):

InputPort addInputPort(void(*callback)(InputPort)); 

problema: las la firma de la función C# generado es:

public InputPort addInputPort(SWIGTYPE_p_f__InputPort____void callback) 

SWIGTYPE_p_f__InputPort____void no es un delegado (y no tiene un constructor público de todos modos), por lo que no se puede utilizar addInputPort.

¿Cómo le digo a SWIG que use un delegado? Si la solución implica% typemap, por favor sea paciente adicional conmigo ...

+1

Supongo que C++/CLI no es una opción? –

+0

Debo investigar más, pero me temo que no es así: ¡grandes piezas precompiladas de middleware adelante! – Calvin1602

+0

El mismo problema. Inicialmente utilicé PInvoke (Detalles en cuestión http://stackoverflow.com/questions/11909484/how-to-use-c-sharp-backgroundworker-to-report-progress-in-native-c-code). Ahora trato de usar SWIG, pero el código se vuelve muy engorroso ... y tampoco me doy cuenta de cómo trabajar con los delegados. – sergtk

Respuesta

1

La solución implica un% typemap. El efecto que está viendo es el mapeo inútil predeterminado para tipos desconocidos. En su caso, el tipo desconocido es la función tipo void *(InputPort).

De hecho, toda la traducción de SWIG se basa en% typemaps que ya se han escrito y viven en bibliotecas SWIG estándar. Puede investigar los% typemaps iniciales para C# en este Subversion location.

En particular, busque SWIGStringHelper en csharphead.swg. Ese código asigna un delegado a una devolución de llamada C. El truco es agregar una implementación de devolución de llamada auxiliar en el módulo SWIG.

+0

Gracias por los enlaces. Ha pasado un año, así que ni siquiera estoy en este proyecto. Pero he escrito algunos mapas de tipos ahora. Intentaré echarle otro vistazo a esto. – Calvin1602