Auf ein C++-Projekt mit C# zugreifen

cbs_i

Grünschnabel
Hallo liebe Mitprogrammierer

Ich stehe vor folgendem Problem: Ich habe ein grösseres Projekt in C# geschrieben (.Net 2.0, Visual Studio 2005) und würde nun gerne für einige komplexe Berechnungen eine C++-DLL verwenden, bzw. deren Klassen/Funktionen. Die C++-DLL ist ebenfalls ein ein Visual Studio Projekt, ich kann sie in die gleiche Projektmappe einfügen und auch kompilieren/linken, alles fehlerfrei. Das Problem bekomme ich, wenn ich versuche, dieses Projekt als Verweis ein mein C#-Projekt einzufügen. Egal ob ich das Projekt oder die DLL einbinden will, er beschwert sich immer mit "Es konnte kein Verweis auf XY hinzugefügt werden". Ich habe mich nun ein wenig schlau gemacht, es müsste ja managed C++-Code sein, um ihn verwenden zu können, soweit ich das verstanden habe (ich habe überhaupt keine Ahnung von C++ :)) Könnte mir jemand sagen, ob es überhaupt eine Möglichkeit gibt, diesen Klassen in meinem C# Projekt zu verwenden, bzw. ob das Projekt, das ich einbinden möchte, ein managed C++-Projekt ist oder in ein solches konvertiert werden kann? Für eine Antwort bin ich sehr dankbar.

Hier der Link zu dem C++-Projekt
http://www.speedsim.net/ --> Downloads, Quellcode


Freundliche Grüsse

cbs
 
Hi

Also wenn ich das richtig gesehen hab, ist die Kernel-Dll (in nehm mal an, um die dreht es sich) in Native C++ geschrieben. Um diese DLL in .NET zu nutzen, muss diese entweder eine COM-DLL sein oder du musst die entsprechenden Funktionen, die du nutzen möchstest per DLLImport in der entsprechenden Klassen, in der du sie nutzen möchtest, deklarieren.
 
Hi niggo,

Merci für deine Antwort zuerst einmal... Also um eine COM-DLL schein es sich nicht zu handeln, ansonsten würde das Einbinden als Verweis funktionieren. (dabei kommt auch eine Fehlermeldung, die darauf hindeutet).
Deine Idee mit dem DLL-Import habe ich gestern auch schon ausprobiert, dazu jedoch 2 Fragen:

1. Reicht es überhaupt aus, wenn ich nur gewisse Funktionen aufrufen kann? (hier die Doku zu dem Kernel: http://home.arcor.de/speedsim/docu ) Weil da muss ich z.B. zuerst
SetFleet (vector< SItem > *Attacker, vector< SItem > *Defender) aufrufen und danach eine Simulate()-Methode... dazu müsste ich doch eine Instanz der Kernel-Klasse erzeugen, da reicht das reine Ausführen von Methoden nicht, oder irre ich mich? Mal abgesehen davon, dass ich die ganzen Structs, die er benutzt, ja auch nicht habe. Könnte ich die einfach in C# nachbauen?

2. Scheint der P/Invoke mit der DLL irgendwie nicht zu funktionieren... Ich gebe zwar explizit den DLL-Namen UND die Methode an (im DLLImport-Attribut), aber er gibt mir immer eine "Einstigspunkt nicht gefunden"-Exception zurück. Kann man jede .DLL mit dem DLLImport benutzen oder gibt es da Einschränkungen? Wenn es jemand anders ausprobieren möchte, wäre ich natürlich auch nicht unglücklich :) hab das P/invoke bisher nur mit API-Funktionen gebraucht...

Wünsche allen ein schönes Wochenende

Gruss cbs_i
 
Hi

Dann wird dir wahrscheinlich nichts anderes übrig bleiben, als eine COM-Schnittstelle zu schreiben für diese DLL.
Dafür bin ich jedoch der falsche Ansprechpartner. In der MSDN wirst du jedoch einiges dazu finden.
 
Zurück