Передача 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
.