Pregunta

¿Alguien ha utilizado la biblioteca SWIG con C #? Si es así, ¿qué escollos encontró y cuál es la mejor manera de usar la biblioteca? Estoy pensando en usarlo como un contenedor para un programa que se escribió en C y quiero envolver los archivos de encabezado donde pueda usarlos en mi aplicación .NET.

Editar: algunas aclaraciones sobre los sistemas operativos de destino.

Planeo ejecutar la aplicación en Linux y Windows, por lo tanto, la razón por la que estoy buscando SWIG. P / Invocar no es una opción.

¿Fue útil?

Solución

Creo que el error que cometieron los carteles anteriores fue leer los documentos y no mirar los ejemplos.

Hace unas horas necesitaba conectar algunas clases de C ++ a C #. Busqué en mi directorio Swig (ya lo tenía para otro trabajo), encontré el directorio Ejemplos / csharp / class , busqué el código, cargué la solución, la graqué, la copié, la coloqué en mi código , funcionó, mi trabajo fue hecho.

Dicho esto, el código P / Invoke generado no es una solución para todas las necesidades. Dependiendo de su proyecto, puede ser igual de simple escribir algunos envoltorios de API simples o escribir C ++ administrado (busque SlimDX para un magnífico ejemplo de esto).

Para mis necesidades, era simple y fácil: tenía mystuff.dll , y ahora además puedo enviar mystuffnet.dll . Estoy de acuerdo en que es difícil acceder al documento.

Edit: Noté que el OP solo mencionó C. Para eso, realmente no necesitas Swig, solo usa sintaxis habitual de interoperabilidad de C # / C DLLImport . Swig se vuelve útil cuando quieres permitir que se invocen clases de C ++ desde C #.

Otros consejos

Para mi último proyecto, aquí está todo el archivo de configuración SWIG de C #:

%module mdProject

%{
#include "mdProject.h"
%}

Lo compilé en SWIG con:

swig -csharp -c++ -I../../Include mdProject.i

Esto generó un Project.cxx que compilé y vinculé directamente a la DLL 'principal', por lo que no necesité una segunda DLL 'helper' de C ++. SWIG también generó un montón de archivos C # que compilé en una DLL .NET. Mis otros contenedores (Java, PHP, etc.) usan una DLL auxiliar.

Como mencionó @patrick, SWIG usa P / Invoke, así que si tienes un problema con eso, necesitarás encontrar otra solución.

Si usa tipos que se desvían de lo común (vacíos, estructuras, etc.), tendrá que hacer un trabajo adicional para hacerlo bien, pero para la API promedio que usa int's, char * 's, etc., está bien.

Intenté usar SWIG para envolver un proyecto C ++ para usar en .NET hace unos años.

No llegué muy lejos, ya que era un enorme dolor gigante producir la configuración que SWIG requería. En ese momento solo quería una solución, no aprender otro idioma / api / etc. SWIG puede ser más fácil de usar en estos días, no podría decírtelo.

Terminamos usando Managed C ++ para envolver el proyecto de C ++. Funcionó muy bien.

Si solo está invocando funciones directamente desde una dll, sugeriría que no se preocupe por ninguna de las anteriores, y que simplemente utilice P / Invoke

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top