2010-03-25 10 views
15

¿Hay alguna forma de crear automáticamente contenedores p/invoke para .net desde un encabezado c?¿Crea automáticamente envoltorios de C# desde c encabezados?

Por supuesto que podría crear a mano, pero manteniendo ellos sería doloroso, y probablemente sería un error en alguna parte como resultado difícil de accidentes de depuración.

me trataron TRAGO, pero creó clases completos donde estructuras simples sería suficiente. Otro problema con SWIG es que requiere código de interoperabilidad adicional en el lado c.

Prefiero que la salida funcione también en mono, pero eso no es necesario.

Otra cosa que podría trabajar con una aplicación que analiza el encabezado c, y crea una salida en un bonito formato intermedio como XML, de la que puede crear el C# derivador de mí mismo.

Edit:
PInvoke Interop Assistant es lo que necesitaba.
Hay algunos pequeños problemas con él sin embargo:
* Se traduce "unsigned char *" a cadena donde yo preferiría IntPtr
* Asume que size_t = int = tiempo = 32 bits. Esto es actualmente cierto para mí, pero podría no ser cierto en todas las plataformas.
¿Hay una manera limpia de arreglar eso? De lo contrario, usaré un poco de buscar y reemplazar en el código c antes de convertirlo.

Respuesta

10

El PInvoke Interop Assistant debe ser un ajuste mejor para usted, que fue diseñado específicamente para trabajar con el código C.

Solo tenga en cuenta que ninguna herramienta le ofrece una solución 100% garantizada, las declaraciones C son manera demasiado ambiguas para garantizar un resultado completamente libre de problemas. Problema causado por los punteros, omnipresente en el código C. No hay forma de saber que un puntero se usa para leer o escribir memoria. O ambos. O quién es responsable de liberar la memoria que está siendo apuntada.

Ésta es una importante para colgar analizadores de código estático, así, que no pueden hacer un buen trabajo porque no saben cómo se utiliza un puntero. Solo pueden inferirlo por el uso, pero ese es un problema de huevo y gallina, el uso puede ser incorrecto. Microsoft solucionó el problema en sus propios encabezados con SAL annotations, marcado extra que es neutral para un compilador pero puede analizarse mediante un analizador de código. Indican explícitamente el uso previsto de un puntero.

También lo utiliza el Asistente de interoperabilidad Pinvoke por lo que puede hacer un mejor trabajo en las declaraciones WinAPI. Pero eso, por supuesto, solo funciona en los encabezados de Microsoft, estas anotaciones SAL normalmente faltan en el código escrito por un programador de C ocupado.

+1

Estoy de acuerdo con el Asistente de Interoperabilidad. Tenga en cuenta que la GUI tiene un error molesto (duración limitada, molesto si quiere traducir muchos archivos de encabezado) y el código C# generado para los campos de bits no solo es realmente feo, sino también incorrecto (es decir, usted * debe * verificar el código de campo de bit manualmente). Para cualquier cosa, excepto los campos de bits, encontré que funciona bien, aunque lo primero que hago con el código es eliminar los espacios de nombres largos ('System.Runtime.InteropServices' para cada atributo). – OregonGhost

+1

Hay algunos pequeños problemas con él. Traduce "char sin signo *" a la cadena donde prefiero IntPtr, y asume que int = largo = 32 bits. ¿Hay alguna manera limpia de arreglar eso? De lo contrario usaré un poco de buscar y reemplazar en el código c antes de convertirlo. – Winner

+1

Esas son las ambigüedades de las que te advertí. De ninguna manera limpia, tener que retocar la declaración de P/Invoke generada es normal. Por cierto: int y long son 32 bits en la mayoría del código C/C++. –

1

Si entiendo tu pregunta correctamente, básicamente estás preguntando si hay una manera de hacer lo que hace SWIG.

Por supuesto, usted quiere hacer un poco diferente, por lo que una opción sería tomar el código TRAGO y cambiarlo a trabajar de la manera que le gustaría.

Cuestiones relacionadas