que - estandares de programacion c#
¿Cuáles son las mejores prácticas al usar SWIG con C#? (3)
¿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.
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.
Intenté usar SWIG para envolver un proyecto C ++ para usar en .NET hace algunos años.
No llegué muy lejos, ya que fue un gran 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 solo está invocando funciones directamente de un dll, le sugiero que no se preocupe por ninguna de las anteriores, y solo use P / Invoke
Creo que el error que cometieron los primeros carteles fue leer 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 era 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: noté que el OP solo mencionaba C. Para eso, realmente no necesitas Swig, solo usa la sintaxis de interoperabilidad DLLImport C # / C habitual . Swig se vuelve útil cuando quieres que las clases de C ++ se invoquen desde C #.
Para mi último proyecto, aquí está todo el archivo de configuración C # SWIG:
%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'', así que no necesité una segunda DLL de C ++ ''helper''. 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 @patrick mencionó, SWIG usa P / Invoke, por lo que si tiene un problema con eso, deberá encontrar otra solución.
Si utiliza tipos que se alejan de lo común (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.