Передача StringBuilder в функцию DLL, ожидающую указатель на символ

Я пытаюсь взаимодействовать с библиотекой DLL, созданной в Delphi. В C ++ я сделал этот вызов совершенно нормально:

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

кудаchannelName тип определяется какtypedef int (CALLBACK* ChannelName)(int,int,char*);

Сейчас я пытаюсь сделать то же самое в C #. Я искал и обнаружил, чтоStringBuilder обычно используется как указатель на символ для функций DLL. Вот как я объявил свою функцию:

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

И вот как я пытаюсь это назвать:

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

Это просто заставляет консоль распечатывать бред, например:

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

Я помню, сталкивался с подобной проблемой в C ++, поэтому яmemset память, которую яmalloc 0. Я попытался найти эквивалент в C #, но, возможно, это проблема сStringBuilder вместо? В случае, если мой вопрос не очень ясен, я просто хочу иметь возможность передать строку в мою функцию, заполнить ее функцией, а затем распечатать. Строки являются неизменяемыми в C #, и хороших опций указателя не существует, поэтому я и пытаюсьStringBuilder.

Ответы на вопрос(1)

Ваш ответ на вопрос