Domanda

Qualcuno là fuori ha usato il SWIG libreria con C#?Se sì, quali insidie ​​hai riscontrato e qual è il modo migliore di utilizzare la libreria?Sto pensando di usarlo come wrapper per un programma scritto in C e voglio racchiudere i file di intestazione dove posso usarli nella mia applicazione .NET.

Modificare:Alcuni chiarimenti sui sistemi operativi di destinazione.

Ho intenzione di eseguire l'applicazione su Linux e Windows, ecco il motivo per cui sto esaminando SWIG.P/Invoke non è un'opzione.

È stato utile?

Soluzione

Penso che l'errore commesso dai poster precedenti sia stato leggere i documenti e non guardare gli esempi.

Qualche ora fa avevo bisogno di interfacciare alcune classi C++ con C#.Ho cercato nella mia directory Swig (l'avevo già per altri lavori), ho trovato la directory Examples/csharp/class, ho sfogliato il codice, caricato la soluzione, l'ho groccato, l'ho copiato, ho inserito il mio codice, ha funzionato, il mio lavoro era finito.

Detto questo, il codice P/Invoke generato non è una soluzione per tutte le esigenze.A seconda del tuo progetto, potrebbe essere altrettanto semplice scrivere tu stesso alcuni semplici wrapper API o scrivere C++ gestito (cerca SlimDX per un superbo esempio di questo).

Per le mie esigenze è stato semplice e facile: l'avevo fatto mystuff.dll, e ora in più posso spedire mystuffnet.dll.Sono d'accordo che è difficile entrare nel documento.

Modificare:Ho notato che l'OP menzionava solo C.Per questo, non hai davvero bisogno di Swig, usa semplicemente il file consueta sintassi di interoperabilità DLLImport C#/C.Swig diventa utile quando vuoi lasciarlo Classi C++ essere richiamato da C#.

Altri suggerimenti

Per il mio ultimo progetto, ecco l'intero file di configurazione SWIG C#:

%module mdProject

%{
#include "mdProject.h"
%}

L'ho compilato in SWIG con:

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

Ciò ha generato un Project.cxx che ho compilato e collegato direttamente alla DLL "principale", quindi non avevo bisogno di una seconda DLL "helper" C++.SWIG ha anche generato una serie di file C# che ho compilato in una DLL .NET.Gli altri miei wrapper (Java, PHP, ecc.) utilizzano una DLL di supporto.

Come menzionato da @patrick, SWIG utilizza P/Invoke, quindi se hai un problema con questo, dovrai trovare un'altra soluzione.

Se usi tipi che si discostano dall'ordinario (vuoti, strutture, ecc.), dovrai fare del lavoro extra per farlo bene, ma per l'API media che utilizza int, char* ecc., va bene.

Ho tentato di utilizzare SWIG per racchiudere un progetto C++ da utilizzare in .NET alcuni anni fa.

Non sono andato molto lontano perché è stato un enorme sforzo produrre la configurazione richiesta da SWIG.All'epoca volevo solo una soluzione, non imparare un'altra lingua/api/ecc.SWIG potrebbe essere più facile da usare al giorno d'oggi, non saprei dirtelo.

Alla fine abbiamo utilizzato Managed C++ per racchiudere il progetto C++.Ha funzionato davvero bene.

Se stai semplicemente invocando funzioni direttamente da una DLL, suggerirei di non preoccuparti di nessuno dei due precedenti e di usare semplicemente P/Invoca

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top