Wrapper von C Code bzw C-LIB in .NET Code?



  • Dann stell mal ne konkretere Frage.

    Meinst Du jetzt C Code nach managed code portieren?
    Meist Du jetzt C++ Code nach managed code portieren?
    Meinst Du C/C++ Code als unmanaged part in einem managed Code ausführen?
    Meinst Du mit managed Code C++/CLI?
    Meinst Du mit managed Code C#?
    Meinst Du mit managed Code VB?
    Willst Du C++ nach C# portieren?
    Willst Du C++ name C++/CLI portieren?
    Und was hat das mit der Häufigkeit zu tuen?
    [...] usw.



  • Ok 🙂

    Ich möchte eine C-Lib/dll in C# managed code wrappen;)



  • Das kannst Du auf drei Möglichkeiten erreichen:
    1. via P/Invoke
    2. via COM Interop (bedeutet allerdings, dass du die C-Lib zuerst mit einem COM Wrapper wrappen musst)
    3. via C++/CLI (bedeutet, dass Du den Interop Layer selbst schreibst)

    Probier doch mal P/Invoke, dass ist der einfachste Weg.
    Hier eine Einführung: http://msdn.microsoft.com/en-us/library/aa446536.aspx
    Ausserdem gibt hier ein Tool um die Signaturen zu erzeugen: http://clrinterop.codeplex.com/

    Simon



  • Dafür brauchst du dann einfach die (statischen) Methoden in C# mit dem Attribut [DllImport] versehen:

    class WrapperLib
    {
      [DllImport("Test.dll"]
      static private extern int MyFunction(); // <- Parameter anpassen
    
      [DllImport("Test.dll"]
      static private extern int MyFunction2(); // <- Parameter anpassen  
    }
    

    Zu weiteren Parametern für [DllImport] schau einfach in die MSDN-Hilfe.
    Und falls du spezielle Datentypen wrappen willst, dann schau dir mal die Klasse 'Marshal' an.

    Die Dll (im Beispiel "Test.dll" genannt) muß sich dann entweder im selben Pfad wie die .NET-Anwendung oder aber in einem der Systempfade befinden.

    P.S. theta war schneller, aber mein Weg entspricht dem P/Invoke.



  • Danke Jungs,

    d.h. ich kann bei der P/Invoke Variante erst alle funkionen 1:1 in eine c# class wrappen.. und dann ne eingene HigLevel Varainte schreiben welche diese Funktionen verwendent!?

    bsp für C dll funktionen:

    void* CreateObject(...);
    
    void DestroyObject(void* pObj);
    

    In C# gibt es ja nich den void Pointer odeR??



  • Zeig mal die Impl. von CreateObject und DestroyObject. Sind da einfach malloc und free Aufrufe dahinder?



  • ja genau;)



  • PorterFreak schrieb:

    ja genau;)

    🙄



  • Ja die CreateObject Funktion erzeugt ein speicherbereich aufm heap mit malloc.
    Und die DestroyObject Funktion gibt diesen speicher wieder frei.

    Wie sieht das denn jetzt aus in C# via P/Invoke!?



  • [DllImport("bla.dll")]
    IntPtr CreateObject(...);
    
    [DllImport("bla.dll")]
    void DestroyObject(IntPtr pObj);
    


  • Hallo Männer,
    ich habe eine C#-Projekt, was String-Befehle handelt. Diese String-Operationen sollen in einem unmanaged C++-Projekt in einem Task aufrufen und der String soll weiterbehandelt (interpretiert oder weitergeleitet) werden.
    Weiterleitung und entsprechender String- Antwort muss der String wieder von C++-projekt an C#-Code übergeben werden.
    Kann man das mit I/Invoke für Aufrufe und Übergabe realisieren? Wenn ja, kennt ihr ein kleines Testbeispiel?

    Vielen Dank, Andreas


Anmelden zum Antworten