Wrapper-dll für eigene Anwendung schreiben
-
Hallo,
ich habe eine bibliothek in c++ vorliegen, die ich in eine .net anwendung verpacken möchte. Die rste Frage die sich mir dabei stellt war, ob ich eine wrapper.dll schreiben muss oder ob es irgendwie anders geht, aber warscheilich muss ich das tun.
Jetzt ist also das Problem, wie fang ich da an? Ich würde gerne die Klassen 1 zu 1 in .net übernehmen. Wie gehe ich da vor, wenn ich eine Klasse habe
namspace X { class Y { protected: some_type some_member; static some_other_type some_member2; public: inline Y : some-member(some_value) {} void some_method(); static some_type some_static_method(); }; }
#include <Y.h> namespace X { ... //implementation ... }
wie verhält es sich mit reinen headerbasierten klassen oder templates, was gibt es zu beachten?
Kann ich die dll dann in jeder .net sprache nehmen oder nur in cli?
-
Wenn die Bibliothek C++ Klassen in der Schnittstelle hat, musst du einen Wrapper schreiben.
Grundsätzlich gibt es dann mehrere Wege:
- Du bleibst bei nativem C++ und schreibst eine DLL, die eine C-Schnittstelle exportiert. Also nur C-Funktionen und elementare Datentypen (char, int, double) bzw. Zeiger darauf und Structs davon.
Jede .net-Sprache sollte über PInvoke mit C-Funktionen aus DLLs umgehen können.
- Du verwendest C++/CLI und baust managed Klassen, die die nativen Klassen aus der Bibliothek als Member haben. Diese Wrapperklassen haben dann den nativen Klassen entsprechende Memberfunktionen, die intern die ggf. Parameter von und zu .net Datentypen konvertieren und den eigentlichen Aufruf an die native Klasse weiterleiten.
Die aus so einer DLL exportierten .net Datentypen, sollte jede .net Sprache verwenden können.
- Auch wieder natives C++: Man schreibt eine Wrapper DLL die COM-Interfaces für die Bibliothek exportiert. COM-Objekte kann man auch in .net benutzen.
Welche Lösung die bessere ist, hängt von der jeweiligen Aufgabe ab. In deinem Fall würde ich zu 2) tendieren.
In C++/CLI kann man auch managed Templates benutzen. Die sind aber auf C++/CLI beschränkt. Generics in .net sind ein bischen anders. Zu dem Thema würde ich aber mal ein Buch empfehlen, z.B. "C++/CLI in Action" oder die dreibändige Serie von Apress.
-
Ok, also Nr. 2
können die .Net Klassen auch einfach erben oder müssen die c++ Klassen als member rein?
Kannst du mir mal für die obere Beispielklasse eine kurze implementierung zeigen?Danke Schonmal!
[Edit]
Für die templates verwende ich bis auf die Accessoren ausschließlich basisdatentypen (int, unsigned int, float, double), wobei .net ja eigene accessor-mechaniken hat, diese also wegfallen.
-
Hier zwei Beispiele von mir:
http://www.c-plusplus.net/forum/p2123773#2123773
http://www.c-plusplus.net/forum/p1716489#1716489
-
Dankeschön, also direct erben geht nicht?
-
Vererbung macht hier keinen Sinn, denn dann wäre es ja kein Wrapper mehr.
Und wie sollte dann von .NET aus auf die C++-Klasse (die ja dann bekannt sein müsste) zugegriffen werden?