由于C#中的char与C++中的char是不同的。
是因为编码方式存在着不同,C#中采用Unicode编码,因此,char的取值范围为0-65535。
而C++ char 类型的取值范围为(-127-128)。
正由于C#中的char与C++中不是完全对应的,因此,当C#调用C/C++编写的DLL时,
不能用char[]与对应C/C++中的char*类型,而是要根据实际情况选择byte,string或StringBuilder。
-
如果DLL中char*不是用来存储ASCII字符,而是用作buffer(即可能出现0-127以外的值),C#端应该用byte[]。
-
如果DLL中char存储一般的ASCII字符,且参数用作输入,C#端应该用string。
-
如果DLL中char存储一般的ASCII字符,且参数用作输出,C#端应该用StringBuilder。其原因在后文会有叙述。
因为此时char*的长度是不确定的,可以用类似
StringBuilder sb = new StringBuilder(Constants.MAXLEN);
达到类似C++中
char* cp = new char[MAXLEN];
及C中
char* cp = (char *)malloc(sizeof(char) * MAXLEN); 的效果。
那么,在C#调用C的DLL时,为什么对于作为输出的参数要用StringBuilder呢?
因为string不能改变自身的值,如果用string的话,函数调用之后string的值不会发生改变。所以输出的参数或返回值我们用StringBuilder来接收。