我正在尝试与在 Delphi 中创建的 DLL 库进行交互。在 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 函数的 char 指针。这是我声明函数的方式:
[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
。