Entwickler-Ecke
Basistechnologien - Verwenden einer C++-DLL in C#
DonKnilch - Fr 21.12.07 21:58
Titel: Verwenden einer C++-DLL in C#
Hi,
Ich verwende eine C++-DLL und möchte ein paar Funktionen dieser in C# nutzen. Ich habe mal zum Test eine Methode in der DLL mit dem Rückgabewert eines int programmiert und das in dem C# Programm aufgerufen. Soweit so gut, das funktioniert. Jetzt möchte ich das Gleiche noch mit einem String als Rückgabewert machen, aber da kommt dann bei mir eine AccessViolationException.
Also zum verdeutlichen: Ich habe eine Methode getString() in meiner DLL und habe diese in das C#-Programm importiert (auch als string deklariert). Wenn ich diese aufrufe, kommt besagter Fehler. Bei der identischen Methode mit dem Rückgabewert int passiert dies jedoch nicht.
Wo liegt hier der Fehler?
Vielen Dank schon mal für Eure Hilfe.
MfG
DonKnilch
Moderiert von
Christian S.: Topic aus C# - Die Sprache verschoben am Fr 21.12.2007 um 21:20
Chryzler - Fr 21.12.07 22:06
Mach mal in der Dll den Rückgabetyp zu nem PChar, und in C# schreibste dann [MarshalAs(UnmanagedType.LPTStr)].
DonKnilch - Fr 21.12.07 22:29
Vielen Dank erst mal, mit PChar hat es dann geklappt. Allerdings habe ich es nicht mit Marshalling auf LPTStr gemacht, sondern mithilfe des StringBuilders, da ich ja einen Ausgabewert brauche und keine Parameter.
Jetzt müsste ich noch wissen, wie ich es äquivalent mit einem Stringvektor, also vector<string> machen kann. Was wäre die Entsprechung dafür in C#?
Kha - Fr 21.12.07 23:06
Ein Vektor wird wohl irgendwie in ein Array konvertierbar sein, und das sollte marshallbar sein. Aber wenn du die Dll selbst geschrieben hast und dir C++ kein Fremdwort ist, würde ich gar nicht auf P/Invoke setzen, sondern C++/CLI benutzen.
DonKnilch - Sa 22.12.07 01:04
Also irgendwie hänge ich jetzt wieder. Ich habe jetzt probiert, ein Int-Array als Parameter zur DLL zu schicken und dort mit Werten füllen zu lassen. Das klappt soweit auch. Wenn ich jetzt allerdings wieder den Datentyp wechsel (also auf String), dann kommt wieder die Fehlermeldung. Ich würde das Array ja gerne von String in PChar umwandeln, aber das funktioniert von seiten C++ nicht so wirklich.
Es sieht also so aus: Ich übergebe ein string[] aus C# als Parameter und in C++ ist es ein string*.
Hat jemand einen Vorschlag, wie ich einen Vektor oder ein Array (oder was Ähnliches) transferiert kriege?
DonKnilch - Sa 22.12.07 14:00
Super, da hätte ich auch selber drauf kommen können. OK, das nimmt er jetzt anstandslos. Ich habe allerdings ein inhaltliches Problem (bestimmt ein Denkfehler): Ich habe ein Array an die C++ Methode übergeben, in das etwas reingeschrieben werden soll. Wenn ich das Array zurück bekomme und ausgeben lasse, steht jedoch nichts drin. Die Methode sieht folgendermaßen aus:
Zitat: |
EXPORT void setArray(char** t) {
string s1 = "ABC";
string s2 = "BCD";
char* c1 = new char[3];
char* c2 = new char[3];
strcpy(c1,s1.c_str());
strcpy(c2,s2.c_str());
t[0]=c1;
t[1]=c2;
} |
Übergeben wird aus C# ein string[] mit der Größe 2.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!