为什么MemoryStream.Write在客户端正常却在服务端编译失败?
解决.NET 4.7.2中MemoryStream.Write缺少必需参数的编译错误(CS7036)
问题核心是不同.NET版本的API差异:.NET 8(客户端)的MemoryStream.Write提供了仅传入byte[]的简化重载,但.NET Framework 4.7.2(服务端)的MemoryStream.Write没有这个重载,必须传入三个参数:byte[] buffer、int offset、int count。你的服务端代码里的ms.Write调用不符合.NET 4.7.2的API要求,因此触发CS7036错误。
修改方案
修改服务端PacketBuilder类的WriteString方法,补充offset(传0,从数组起始位置开始写)和count(传数组长度)参数:
public void WriteString(string msg) { var msgLength = msg.Length; var lengthBytes = BitConverter.GetBytes(msgLength); ms.Write(lengthBytes, 0, lengthBytes.Length); // 补充offset和count参数 var msgBytes = Encoding.ASCII.GetBytes(msg); ms.Write(msgBytes, 0, msgBytes.Length); // 补充offset和count参数 }
修改后的完整服务端代码
using System; using System.IO; using System.Text; namespace ChatServer.Net.IO { class PacketBuilder { MemoryStream ms; public PacketBuilder() { ms = new MemoryStream(); } public void WriteOpCode(byte opcode) { ms.WriteByte(opcode); } public void WriteString(string msg) { var msgLength = msg.Length; var lengthBytes = BitConverter.GetBytes(msgLength); ms.Write(lengthBytes, 0, lengthBytes.Length); var msgBytes = Encoding.ASCII.GetBytes(msg); ms.Write(msgBytes, 0, msgBytes.Length); } public byte[] GetPacketBytes() { return ms.ToArray(); } } }
参数说明
offset设为0:表示从字节数组的起始位置读取数据写入流count设为数组长度:表示将整个数组的内容全部写入流
修改后服务端即可正常编译,且逻辑与客户端保持一致。
内容的提问来源于stack exchange,提问作者obtein
相关产品推荐
相关产品推荐

