Was sind die besten Praktiken, wenn sie mit C # unter Verwendung von SWIG?

StackOverflow https://stackoverflow.com/questions/25268

  •  09-06-2019
  •  | 
  •  

Frage

Hat jemand da draußen verwendet, um die SWIG Bibliothek mit C #? Wenn Sie haben, welche Tücken haben Sie und was ist der beste Weg, um die Bibliothek zu benutzen? Ich denke an mich als Wrapper für ein Programm, das in C geschrieben wurde, und ich mag die Header-Dateien wickeln, wo ich sie in meiner .NET-Anwendung verwenden kann.

Edit: Einige Klärung Ziel OS.

Ich plane, um die Anwendung auf Linux und Windows auf ausgeführt wird, daher der Grund, warum ich in SWIG suchen. P / Invoke ist keine Option.

War es hilfreich?

Lösung

Ich denke, der Fehler der früheren Plakate haben die Dokumentation gelesen wurde und nicht an den Beispielen zu sehen.

Vor ein paar Stunden brauchte ich einige C ++ Klassen in C # zu verbinden. Ich sah in meinem Swig dir (ich es bereits für andere Arbeit hatte), das Verzeichnis Examples/csharp/class gefunden, durchsucht den Code, geladen, um die Lösung, grokked es, kopiert es, legte in meinem Code, es funktioniert, meine Arbeit geleistet wurde.

Mit diesem wird gesagt, erzeugt P / code Invoke ist keine Lösung für alle Bedürfnisse. Je nach Projekt kann es nur so einfach sein, ein paar einfachen API-Wrapper selbst zu schreiben oder Managed C ++ schreiben (Look up SlimDX für ein hervorragendes Beispiel dafür).

Für meine Bedürfnisse, war es einfach und leicht - ich hatte mystuff.dll, und jetzt zusätzlich kann ich mystuffnet.dll versenden. Ich werde darüber einig, dass die Doc schwierig ist, in zu erhalten.

Edit: Ich habe bemerkt, die OP nur C. erwähnt Dafür brauchen Sie nicht wirklich Swig, benutzen Sie einfach die üblicher C # / C DLLImport Interop-Syntax . Swig wird nützlich, wenn Sie lassen wollen C ++ Klassen von C # aufgerufen werden.

Andere Tipps

Für mein letztes Projekt, hier ist die gesamte # SWIG Konfigurationsdatei C:

%module mdProject

%{
#include "mdProject.h"
%}

ich es in SWIG zusammengestellt mit:

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

Dies erzeugte eine Project.cxx, die ich zusammengestellt und direkt in den ‚main‘ DLL verknüpft, so dass ich nicht ein zweiten C ++ ‚Helfer‘ DLL benötigen. SWIG erzeugt auch eine Reihe von C # Dateien, die ich in einer .NET-DLL kompiliert. Meine andere Wrapper (Java, PHP, etc.) tun einen Helfer DLL verwenden.

Wie @patrick erwähnt, SWIG verwendet P / Invoke, also wenn Sie ein Problem damit haben, müssen Sie eine andere Lösung finden.

Wenn Sie Typen verwenden, die von der gewöhnlichen streunen (Hohlräume, Strukturen, usw.), werden Sie einige zusätzliche Arbeit zu tun haben, es richtig zu machen, aber für den durchschnittlichen API int die Verwendung von char * 's etc, es ist in Ordnung.

ich versucht habe SWIG zu verwenden, vor einem Projekt C ++ für die Verwendung in .NET ein paar Jahren zu wickeln.

Ich habe nicht sehr weit, da es ein massiver riesiger Schmerz war die Konfiguration zu erzeugen, die erforderlich saufen. Zu der Zeit wollte ich nur eine Lösung, nicht eine andere Sprache / api / etc lernen. SWIG kann einfacher sein, in diesen Tagen zu verwenden, könnte ich Ihnen nicht sagen.

Am Ende haben wir mit Managed C ++ die C ++ Projekt zu wickeln. Es funktionierte wirklich gut.

Wenn Sie nur Funktionen direkt aus einem dll aufrufen, würde ich vorschlagen, keine Sorgen über eine der oben, und nur mit P / Invoke

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top