当前位置: 首页 > 编程语言 > C#

CDLL中的PInvokechar-在C#中被当作String来处理,空字符问题分享

时间:2023-04-10 21:11:04 C#

CDLL中的PInvokechar*在C#中被当作String来处理。空字符问题CDLL中的函数如下所示:intmy_Funct(char*input,char*output);我必须从C#应用程序调用它。我的做法如下:...DllImportstuff...publicstaticexternintmy_Funct(stringinput,stringoutput);输入字符串完美地传输到DLL(我有可见证书)。但是函数填充的输出是错误的。我有像这样的十六进制数据:3F-D9-00-01但不幸的是,两个零之后的所有内容都被截断了,只有前两个字节进入了我的C#应用程序。发生这种情况是因为(我猜)它将它视为空字符并将其放在字符串的末尾。有什么想法可以摆脱它吗?我尝试将其指定为IntPtr而不是字符串,但我不知道以后如何处理它。在我尝试之后:byte[]b1=newbyte[2];元帅复制(输出,b1,0,2);2通常应该是字节数组的长度。但是我遇到了各种错误:比如“请求的范围超出了数组的末尾”。或“试图读取或写入受保护的内存......”我感谢任何帮助。您错误地编组了输出字符串。将数据从托管传递到本机时,在p/invoke语句中使用字符串是合适的。但是当数据向另一个方向流动时你不能使用它。相反,您需要使用StringBuilder。像这样:[DllImport(...)]publicstaticexternintmy_Funct(stringinput,StringBuilderoutput);然后为输出分配内存:StringBuilderoutput=newStringBuilder(256);//256是以字符为单位的容量-只有你知道需要多大的缓冲区才能调用该函数。intretval=my_Funct(inputStr,输出);字符串outputStr=output.ToString();另一方面,如果这些参数包含空字符,则无法编组为字符串。这是因为编组器不会编组任何超过null的内容。相反,您需要将其编组为字节数组。publicstaticexternintmy_Funct([In]byte[]input,[Out]byte[]output);这与您的C声明相符。然后将输入字符串转换为字节数组,假定ANSI编码如下:byte[]input=Encoding.Default.GetBytes(inputString);如果您想使用不同的编码,很明显该怎么做。对于输出,您需要分配数组。假设它与输入的长度相同,你会这样做:byte[]output=newbyte[input.Length];不知何故,您的C函数必须知道数组的长度。交给你吧!然后你可以调用函数intretval=my_Funct(input,output);然后再次使用Encoding类将输出数组转换回C#字符串。以上是C#学习教程:CDLL中的PInvokechar*在C#中作为String处理。空字符问题分享的所有内容,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注—stringoutputString=Encoding.Default.GetString(output);本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: