Przekazywanie StringBuilder do funkcji DLL oczekującej wskaźnika char

Próbuję współdziałać z biblioteką DLL utworzoną w Delphi. W C ++ wywołałem to doskonale:

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

GdziechannelName jest typ zdefiniowany jakotypedef int (CALLBACK* ChannelName)(int,int,char*);

Teraz próbuję zrobić to samo w C #. Szukałem i znalazłem toStringBuilder jest powszechnie używany jako wskaźnik znaków dla funkcji DLL. Oto jak zadeklarowałem swoją funkcję:

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

Oto jak to nazywam:

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

Sprawia to, że konsola drukuje jibberish, na przykład:

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

Pamiętam, że wpadłem na podobny problem w C ++, dlatego teżmemset pamięć, którą jamalloc do 0. Próbowałem znaleźć odpowiednik w C #, ale być może jest to problem zStringBuilder zamiast? W przypadku, gdy moje pytanie nie jest jasne, po prostu chcę móc przekazać ciąg do mojej funkcji, wypełnić tę funkcję, a następnie wydrukować. Ciągi są niezmienne w C # i nie istnieją żadne dobre opcje wskaźnika, dlatego próbujęStringBuilder.

questionAnswers(1)

yourAnswerToTheQuestion