PInvoic char * in C DLL behandelt als String in C #. Problem mit Nullzeichen

9

Die Funktion in C DLL sieht folgendermaßen aus:

%Vor%

Ich muss dies von C # app aufrufen. Ich mache das auf folgende Weise:

%Vor%

Die Eingabe-Zeichenfolge wird perfekt an die DLL übertragen (ich habe einen sichtbaren Beweis dafür). Die Ausgabe, die die Funktion ausfüllt, ist zwar falsch. Ich habe Hexa-Daten drin, wie:

%Vor%

Aber leider ist alles, was nach den zwei Nullen ist, abgeschnitten, und nur die ersten zwei Bytes kommen zu meiner C # -App. Es passiert, weil (ich denke) es als Nullzeichen behandelt und es als das Ende der Zeichenkette nimmt.

Irgendeine Idee, wie ich es loswerden könnte? Ich habe versucht, es als out IntPtr anstatt einer Zeichenfolge zu spezifizieren, aber ich weiß nicht, was ich danach machen soll. Ich habe versucht nach zu tun:

%Vor%

2 sollte normalerweise die Länge des Byte-Arrays sein. Aber ich bekomme alle Arten von Fehlern: wie "Requested Bereich erstreckt sich über das Ende des Arrays." oder "Versuch, geschützten Speicher zu lesen oder zu schreiben ..."

Ich schätze jede Hilfe.

    
user2124150 07.03.2013, 14:29
quelle

1 Antwort

12

Sie haben die Ausgabezeichenfolge falsch sortiert. Die Verwendung von string in der p / invoke-Deklaration ist geeignet, wenn Daten von verwaltet an nativ übergeben werden. Aber Sie können das nicht verwenden, wenn die Daten in die andere Richtung fließen. Stattdessen müssen Sie StringBuilder verwenden. So:

%Vor%

Ordnen Sie dann den Speicher für die Ausgabe zu:

%Vor%

Und dann kannst du die Funktion aufrufen.

%Vor%

Wenn diese Parameter jedoch Nullzeichen enthalten, können Sie nicht als String marshallen. Das ist so, weil der Marshaller nichts über die Null marshallen wird. Stattdessen müssen Sie es als Byte-Array marshallen.

%Vor%

Das entspricht Ihrer C-Deklaration.

Wenn Sie die ANSI-Kodierung übernehmen, konvertieren Sie die Eingabe-Zeichenfolge in ein Byte-Array wie folgt:

%Vor%

Wenn Sie eine andere Kodierung verwenden möchten, ist es offensichtlich, wie das geht.

Und für die Ausgabe müssen Sie das Array zuweisen. Vorausgesetzt, es ist die gleiche Länge wie die Eingabe, würden Sie dies tun:

%Vor%

Und irgendwie muss deine C-Funktion die Länge der Arrays kennen. Ich überlasse dir diesen Teil!

Dann können Sie die Funktion

aufrufen %Vor%

Um das Ausgabe-Array wieder in eine C # -Zeichenfolge umzuwandeln, verwenden Sie erneut die Klasse Encoding .

%Vor%     
David Heffernan 07.03.2013, 15:21
quelle

Tags und Links