Passando StringBuilder para função DLL esperando ponteiro char

Estou tentando interagir com uma biblioteca DLL criada no Delphi. Em C ++, fiz essa ligação perfeitamente bem:

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

OndechannelName&nbsp;é tipo definido comotypedef int (CALLBACK* ChannelName)(int,int,char*);

Agora estou tentando fazer a mesma coisa em c #. Eu procurei e descobri queStringBuilder&nbsp;é comumente usado como um ponteiro de caractere para funções DLL. Aqui está como eu declarei minha função:

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

E aqui está como eu estou tentando chamar isso:

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

Isso é apenas fazer o console imprimir um lixo, por exemplo:

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

Lembro-me de ter encontrado um problema semelhante em C ++, e é por isso quememset&nbsp;a memória que eumalloc&nbsp;para 0. Eu tentei encontrar um equivalente em c #, mas talvez seja um problema com oStringBuilder&nbsp;em vez de? Caso minha pergunta não seja muito clara, eu só quero poder passar uma string para minha função, fazer com que a função a preencha e depois imprimi-la. As strings são imutáveis ​​em C # e não existem boas opções de ponteiro, e é por isso que estou tentandoStringBuilder.