Wrapper von C Code bzw C-LIB in .NET Code?
-
versteh das auch net^^
-
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