Laden...

Tutorial gesucht für: Wrapper für C++ DLL erstellen8

Erstellt von _Lina_ vor 15 Jahren Letzter Beitrag vor 15 Jahren 8.074 Views
_
_Lina_ Themenstarter:in
3 Beiträge seit 2008
vor 15 Jahren
Tutorial gesucht für: Wrapper für C++ DLL erstellen8

Hallo liebes Forum,

ich habe eine C++ DLL bekommen, die ich nun in meine bestehende C# Applikation (unter VS2005) einsetzen muss. Ich habe schon das halbe Netz nach einem Tutorial durchsucht, in dem die Technik und Verfahren mal beschrieben ist, doch leider keins gefunden.

Was ich bis jetzt nun gefunden habe ist:

  1. Ich kann die C++ Funktionen nicht direkt aus der DLL aufrufen
  2. Ich muss dafür eine "Klasse" (Wrapper) drumherum konstruieren, die mir die Schnittstelle zu den eigentlichen DLL- Funktionen geben.

Soweit ist ja alles klar und verständllich - nur eine weiterführende Beschreibung habe ich leider nicht finden können.

Grundlegende Programmierkenntnisse habe ich schon - nur halt bei DLLs hab ich wohl gefehlt 😉

Also liebes Forum, falls ihr diese Frage nicht schon zum tausendsten Mal gehört habt und vielleicht sogar einen Link oder sonstiges zu einem Tutorial habt - das wäre SUUPER!!

Danke & Gruß
Lina

Q
204 Beiträge seit 2005
vor 15 Jahren

Hallo Lina

Versuchs mal hier oder auf codeproject

_
_Lina_ Themenstarter:in
3 Beiträge seit 2008
vor 15 Jahren

Hallo Qt21580,

vielen Dank für die Posts. Ich lese mir gerade mal durch. Aber vielleicht nur mal zum grundsätzlichen Verständnis, weil ich glaube ich hab's noch nicht verstanden:

Ich habe eine C++ DLL mit Funktionen. Von diesen Funktionen kenne ich aber nur den Funktionsrumpf, sprich Rückgabewert und Parameter, nicht den Code.

Kann ich nun die DLL Funktionen verwenden, indem ich mithilfe von [DLLImport] "vorher bekanntmache" oder muss ich eine C# DLL- Projekt bauen, indem ich dann mit [DLLImport] arbeite?

also quasi

in der DLL:
[C++]
..
int CountClients(char *pszClientName)
(..)
..

und dann in meine C# Projekt

[C#]
...
[DLLImport("ImportMe.DLL")]
public static extern int CountClients(char *pszClientName);
...

(Sorry für die blöden Fragen, aber es ist für mich noch nicht ganz klar...)

Vielen lieben Dank
Lina

R
494 Beiträge seit 2006
vor 15 Jahren

Es gibt auch einige webcasts bei microsoft zu dem Thema Managed c++ wrapper.

Das funktioniert (zumindest fast) so.
char *pszClientName gibt es z.b. nicht.

🛈 hat auch ein Kapitel dazu

_
_Lina_ Themenstarter:in
3 Beiträge seit 2008
vor 15 Jahren

SUUPER!!

DA- HANKE für die Tipps! Den Rest les ich mir an und durch!

Wenn ich das dann mal fertig habe -> vielleicht auch mal ein Thema für die FAQ.

Liebe Grüße
Lina

M
194 Beiträge seit 2008
vor 15 Jahren

Hallo Lina,

[DLLImport("ImportMe.DLL")]  
public static extern int CountClients(char *pszClientName);  

das Prinzip ist schon richtig. Allerdings musst du bei den Datentypen aufpassen. Kann sein, dass du einige Datentypen über die Marshal-Klasse von unmanaged in managed Code umwandeln musst. Bei den Grunddatentypen ist das aber kein Problem. In deinem Fall würde die Import-Anweisung so lauten:

[DLLImport("ImportMe.DLL")]
public static extern int CountClients(string szClientName);

const char* kannst du mit string oder StringBuilder marshallen.

"Indem Sie über dieses ernste Thema lachen disqualifizieren Sie sich selbst."
mrleeh.de

3.971 Beiträge seit 2006
vor 15 Jahren

Kleiner Hinweis, P/Invoke(Dllimport) ist pures C. C++ wird hingegen bei COM-Interop (mittels ATL) verwendet und ermöglicht es ganze Klassen als Bibliothek in anderen Anwendungen zu benutzen. Mittels P/Invoke können nur einzelne Funktionen aus einer anderen Dlls (oft System, oder Kernel-Dlls) aufgerufen werden.

So arbeitet .NET mit Win32 und COM zusammen

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...