Autor Beitrag
DonKnilch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Fr 21.12.07 21:58 
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 user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Fr 21.12.2007 um 21:20
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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?
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 22.12.07 12:35 
Sollte ein char** auf der C++- und ein [In, Out] string[] auf der C#-Seite sein. msdn2.microsoft.com/...ibrary/dd93y453.aspx
DonKnilch Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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.