Pasando StringBuilder a la función DLL esperando el puntero de caracteres

Estoy tratando de interactuar con una biblioteca DLL creada en Delphi. En C ++, hice esta llamada perfectamente bien:

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

DóndechannelName es el tipo definido comotypedef int (CALLBACK* ChannelName)(int,int,char*);

Ahora estoy tratando de hacer lo mismo en C #. He buscado y encontrado queStringBuilder Se usa comúnmente como un puntero de caracteres para las funciones DLL. Así es como declaré mi función:

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

Y así es como estoy tratando de llamarlo:

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

Esto es solo hacer que la consola imprima jibberish, por ejemplo:

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

Recuerdo que me encontré con un problema similar en C ++, por lo quememset el recuerdo que yomalloc a 0. Traté de encontrar un equivalente en C #, pero tal vez es un problema con elStringBuilder ¿en lugar? En caso de que mi pregunta no sea muy clara, solo quiero poder pasar una cadena a mi función, hacer que la función la llene y luego imprimirla. Las cadenas son inmutables en C # y no existen buenas opciones de punteros, por eso lo estoy intentandoStringBuilder.

Respuestas a la pregunta(1)

Su respuesta a la pregunta