Übergabe von StringBuilder an die DLL-Funktion, wobei der Zeichenzeiger erwartet wird

Ich versuche mit einer in Delphi erstellten DLL-Bibliothek zu interagieren. In C ++ habe ich diesen Aufruf perfekt gemacht:

for(int y = 1; y <= 12; y++)
{
    char * chanName = (char *) malloc(21); 
    memset(chanName,0,21);
    channelName(y,20,chanName);
    ...
}

WoherchannelName ist Typ definiert alstypedef int (CALLBACK* ChannelName)(int,int,char*);

Jetzt versuche ich, dasselbe in C # zu tun. Ich habe das gesucht und gefundenStringBuilder wird häufig als Zeichenzeiger für DLL-Funktionen verwendet. So habe ich meine Funktion deklariert:

[DllImport("myDLL.dll")]
public static extern int ChannelName(int x, int y, StringBuilder z);

Und so versuche ich es zu nennen:

for (int x = 0; x < 12; x++)
{
    StringBuilder b = new StringBuilder(100);
    DLLInterface.ChannelName(x+1, b.Length, b);
    Console.WriteLine(b.ToString());
}

Dies bringt die Konsole nur zum Ausdrucken, zum Beispiel:

☺ §
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9
☺ î☺8f9

Ich erinnere mich an ein ähnliches Problem in C ++, weshalb ichmemset die Erinnerung, die ichmalloc Ich habe versucht, ein Äquivalent in C # zu finden, aber vielleicht liegt es an derStringBuilder stattdessen? Für den Fall, dass meine Frage nicht sehr klar ist, möchte ich nur eine Zeichenfolge an meine Funktion übergeben, diese füllen und dann ausdrucken können. Strings sind in C # unveränderlich und es gibt keine guten Zeigeroptionen, weshalb ich es versucheStringBuilder.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage