Entwickler-Ecke

Basistechnologien - C++ DLL Klasse mit C# benutzen


Tobias O - Fr 27.07.07 15:14
Titel: C++ DLL Klasse mit C# benutzen
Ich habe eine C++ DLL (gleich vorweg, ich habe sehr schlechtes C++ Wissen), welche in einer Klassenstruktur aufgebaut ist. Nun will ich ein Tool in C# schreiben, welches auf die DLL zugreift und alles daraus benutzen kann.
Ich habe einen C++ Code, worin einfach ein Objektpointer angelegt wird, mit dem dann gearbeitet wird. Wie kann ich mir ein Objekt der Klasse anlegen? Oder gibt es wenigstens einen Weg auf die Funktionen zuzugreifen, auch wenn ich kein Objekt anlegen kann?
Hier ein paar Code Snippets aus C++:

Die Funktion in der DLL, welche ich aufrufen will (Handle ist nur ein u_16):

Quelltext
1:
Handle CSerialInterface::Echo(u_16 echoCounter, u_8 echoDataLength, const u_8 *echoData)                    


Das Erstellen des Objektes unter C++ in der Headerdatei der MainForm:

Quelltext
1:
CSerialInterface *mInterface;                    


Der Aufruf unter C++ (wenns unter C# nur so einfach wäre *g* ):

Quelltext
1:
2:
  
mInterface->Echo(0,0,NULL);


Ich probiere da jetzt schon lange dran rum. Das Liebste wäre mir, wenn ich die Funktion direkt aufrufen könnte... Aber das ist nicht so leicht. Das schlimme ist ja, dass ich das mit dem Mobile Framework mache, wo man bei einer Fehlermeldung nichts gesagt bekommt :( (NotSupportedException)

Das nächste Problem wird durch den Pointer im Funktionsaufruf gestellt, aber ich glaube das müsste ich damit hinbekommen haben:


Quelltext
1:
2:
[DllImport("SPLib.dll")]
public static extern UInt16 Echo(UInt16 echoCounter, bzte echoDataLength, [In, MarshalAs( UnmanagedType.FunctionPtr)] byte echoData);


Tobias O - Sa 28.07.07 14:41

So... Ich habe es nun herausgefunden... Es ist nicht möglich mit C# auf die Klasse zuzugreifen, man muss ich zuerst eine weitere DLL in C++ schreiben, die auf die erste Klasse zugreift.

Aber trotzdem kommt eine weitere Frage: Weiß jemand, ob das im .NET 3.0 vllt. anders ist?

Ein gutes Tutorial zum Thema gibt es hier (falls mal jemand das selbe problem hat und die Suchfunktion benutzt): http://codeguru.earthweb.com/cpp/cpp/cpp_managed/interop/article.php/c6867/#more


Christian S. - Sa 28.07.07 14:44

user profile iconTobias O hat folgendes geschrieben:
Aber trotzdem kommt eine weitere Frage: Weiß jemand, ob das im .NET 3.0 vllt. anders ist?
.NET 3.0 ist gegenüber zu 2.0 nur eine Erweiterung der Klassenbibliothek, das wird also nicht anders sein.


Kha - Sa 28.07.07 21:00

user profile iconTobias O hat folgendes geschrieben:
Weiß jemand, ob das im .NET 3.0 vllt. anders ist?
Eine unmanaged Instanz direkt wie ein CLR-Objekt zu behandeln wirst du wohl in jeder kommenden Version vermissen. C++/CLI gibt es jedoch bereits seit VS 2005 :zwinker: .