2008-08-24 12 views
16

¿Alguien ha usado la biblioteca SWIG con C#? Si es así, ¿qué escollos encontraste y cuál es la mejor manera de usar la biblioteca? Estoy pensando en utilizarlo como un contenedor para un programa que se escribió en C y quiero envolver los archivos de encabezado donde puedo usarlos en mi aplicación .NET.¿Cuáles son las mejores prácticas al usar SWIG con C#?

Editar: Algunas aclaraciones sobre el sistema operativo objetivo.

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

Respuesta

8

Creo que el error de los carteles anteriores hicieron fue leído los documentos y no mirar los ejemplos.

Hace unas horas necesitaba conectar algunas clases de C++ a C#. Busqué en mi directorio de Swig (ya lo tenía para otro trabajo), encontré el directorio Examples/csharp/class, busqué el código, cargué la solución, la compilé, la copié, puse mi código, funcionó, mi trabajo estaba 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 sencillo escribir algunas envolturas API simples usted mismo o escribir C++ administrado (Busque SlimDX para obtener un excelente 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 el documento es difícil de entender.

Editar: Me di cuenta de que el OP solo menciona C. Para eso, realmente no necesita Swig, solo use el usual C#/C DLLImport interop syntax. Swig se vuelve útil cuando quieres que C++ clases se invoquen desde C#.

+0

Creo que SWIG es genial incluso para C. ¡Puede convertir la programación de procedimientos en oop! – Matthias

5

Intenté utilizar SWIG para envolver un proyecto C++ para usarlo en .NET hace algunos años.

No llegué muy lejos, ya que era un enorme dolor gigante para producir la configuración que requiere SWIG. 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 C++. Funcionó realmente bien.

Si acaba de invocar funciones directamente de una DLL, sugeriría no preocuparse por cualquiera de los anteriores, y sólo usar P/Invoke

14

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

%module mdProject 

%{ 
#include "mdProject.h" 
%} 

compilé en TRAGO con:

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

Esto generó un Project.cxx cual compila y se enlaza directamente en la DLL 'principal', así que no necesitaba una segunda DLL 'ayudante' de C++. SWIG también generó un grupo de archivos C# que compilé en una DLL .NET. Mis otras envolturas (Java, PHP, etc.) usan una DLL auxiliar.

Como se menciona @patrick, SWIG usa P/Invoke, por lo que si tiene un problema con eso, deberá buscar otra solución.

Si utiliza tipos que se salen de lo normal (vacíos, estructuras, etc.), tendrá que hacer un trabajo extra para hacerlo bien, pero para la API promedio que usa int, char * etc., está bien .

+0

Sé que esto fue el año pasado ... pero ¿podría compartir cómo "compiló y vinculó directamente en la 'principal' DLL" el archivo .cxx generado? No tengo ni idea de cómo haces esto. ¡Gracias por adelantado! :) –

+0

Debería tener el código fuente en la DLL 'principal' (C++ en mi caso). Acabo de abrir el proyecto DLL C++, agregué el archivo C++ autogenerado de SWIG al proyecto y lo reconstruí. Si no tiene acceso a la fuente de la DLL, no puede hacer esto. En otras palabras, no puede agregar incrementalmente un nuevo archivo fuente a una DLL existente; todo debe volver a empezar desde cero con la adición del nuevo archivo fuente. Muchas veces no tiene acceso a la fuente, por lo que termina teniendo que hacer una pequeña DLL entre su código C# y la DLL. –

Cuestiones relacionadas