2010-01-03 6 views
7

In C# PInvoke, wie übergebe ich einen Zeichenfolgenpuffer, so dass die C-DLL es füllt und zurückgibt? Was wird die PInvoke-Erklärung sein?C# PInvoice out Zeichenfolgen-Deklaration

Die C-Funktionsdeklaration ist

int GetData(char* data, int buflength); 

In C#, ich habe es erklärt, wie

[DllImport(DllName)] 
static extern Int32 GetData([MarshalAs(UnmanagedType.LPStr)]StringBuilder receiveddata, Int32 buflen); 

Ist es richtig? Ich übergebe die StringBuilder-Variable wie folgt

Ich würde gerne wissen, ob es richtig ist oder nicht?

Danke

+0

Es ist richtig, wenn es funktioniert. Es gibt keinen offensichtlichen Grund, warum es nicht funktionieren sollte. –

Antwort

7

Ich glaube, es ist korrekt.

[DllImport(DllName)] 
static extern int GetData(StringBuilder data, int length); 

die wie folgt genannt: Ich wollte einmal

StringBuilder data = new StringBuilder(32); 
GetData(data, data.Capacity); 

mehr Kontrolle über den Bytes durch meine Funktion und tat es so wieder haben:

[DllImport(DllName)] 
private unsafe static bool GetData(byte* data, int length); 

verwendet wie diese :

byte[] bytes = new byte[length]; 

fixed(byte* ptr = bytes) 
{ 
    bool success = Library.GetData(ptr, length); 

    if (!success) 
    Library.GetError(); 

    return Encoding.UTF8.GetString(bytes); 
} 
3

ich mache denke nicht, dass hier das Attribut MarshalAs benötigt wird. StringBuilder ist die richtige Wahl für char * out.

Ich denke, es wird gut sein, die CharSet-Eigenschaft hinzuzufügen, da Sie hier mit Strings arbeiten.

So:

[DllImport(DllName, CharSet=CharSet.Auto)]