mscorlib.dll 中出现了“System.ArgumentOutOfRangeException”类型的第一次机会异常

Posted

技术标签:

【中文标题】mscorlib.dll 中出现了“System.ArgumentOutOfRangeException”类型的第一次机会异常【英文标题】:A first chance exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll 【发布时间】:2012-08-09 10:02:38 【问题描述】:

我是 C# 客户端和服务器应用程序的新手,我正在处理文件上传客户端和服务器应用程序。

我可以成功地将我的文件名和文件数据从客户端应用程序上传到服务器。但是当我尝试实现一个新的文本框时,允许文件上传客户端输入他/她的姓名并在他/她单击发送按钮时将信息连同文件名和文件数据一起发送。

客户端应用程序。

 /* file name and file length */
            byte[] fName = Encoding.UTF8.GetBytes(fileName);
            byte[] fNameLen = BitConverter.GetBytes(fileName.Length); // length of file name
            clientData = new byte[4 + fileName.Length];                
            System.Diagnostics.Debug.WriteLine("fName " + fName.Length);
            System.Diagnostics.Debug.WriteLine("fNamelen " + fNameLen.Length);
            fNameLen.CopyTo(clientData, 0);
            fName.CopyTo(clientData, 4);

            /* author name and author name length */
            byte[] aName = Encoding.UTF8.GetBytes(textBox2.Text);
            byte[] aNameLen = BitConverter.GetBytes(textBox2.Text.Length);
            System.Diagnostics.Debug.WriteLine("aName " + aName.Length);
            System.Diagnostics.Debug.WriteLine("aNamelen " + aNameLen.Length);
            authorData = new byte[9 + textBox2.Text.Length];
            aNameLen.CopyTo(authorData, 5);
            aName.CopyTo(authorData, 9);

服务器应用程序

/* retriving of file name */
               System.Diagnostics.Debug.WriteLine("Error 1");
               fNameLen = BitConverter.ToInt32(state.buffer, 0);
               System.Diagnostics.Debug.WriteLine("Error 2 fNameLen " + fNameLen);
               string Filename = Encoding.UTF8.GetString(state.buffer, 4, fNameLen);
               System.Diagnostics.Debug.WriteLine("Error 3");
               System.Diagnostics.Debug.WriteLine("filename length " + fNameLen);
               receivedPath = @"C:\testfiles\" + Filename;
               System.Diagnostics.Debug.WriteLine("bytesREad1 " + bytesRead);
               System.Diagnostics.Debug.WriteLine(receivedPath);

               /* retriving of author name */
               aNameLen = BitConverter.ToInt32(state.buffer, 5);
               System.Diagnostics.Debug.WriteLine("Error 4");
               System.Diagnostics.Debug.WriteLine("error  5");
               System.Diagnostics.Debug.WriteLine("author name length " + aNameLen);
               string authorName = ASCIIEncoding.ASCII.GetString(state.buffer, 9, aNameLen);
               System.Diagnostics.Debug.WriteLine("Error 6");
               System.Diagnostics.Debug.WriteLine("author name " + authorName);
               System.Diagnostics.Debug.WriteLine("author name length " + aNameLen);

输出窗口和错误以粗体显示:

错误 1 错误 2 fNameLen 12 错误 3 文件名长度 12 bytesRead1 82 C:\testfiles\Test1122.txt 错误 4 错误 5 作者姓名长度829715301 “System.ArgumentOutOfRangeException”类型的第一次机会异常 发生在 mscorlib.dll 中

提前谢谢你。

【问题讨论】:

在哪里抛出异常?? 问题可能出在aNameLen = BitConverter.ToInt32(state.buffer, 5);这一行。这5不应该在那里。这里正确的数字是 4 + 文件名长度。 在这一行字符串处抛出异常 authorName = ASCIIEncoding.ASCII.GetString(state.buffer, 9, aNameLen); 我尝试将aNameLen = BitConverter.ToInt32(state.buffer, 5); 更改为aNameLen = BitConverter.ToInt32(state.buffer, 4 + Filename.Length);aNameLen = BitConverter.ToInt32(state.buffer, 4 + fNameLen); 都返回null 【参考方案1】:

如果你使用 BinaryReader / BinaryWriter,事情会更容易。

例子:

客户

fileContents 是一个字节数组。

var stream = new MemoryStream();
var writer = new BinaryWriter(stream);
writer.Write(fileName);
writer.Write(authorName);
writer.Write(fileContents.Length);
writer.Write(fileContents);

var data = stream.ToArray();  // send this data array to server
writer.Dispose();
stream.Dispose();

服务器

var stream = new MemoryStream(state.buffer);
var reader = new BinaryReader(stream);

var fileName = reader.ReadString();
var author = reader.ReadString();
var fileContents = reader.ReadBytes(reader.ReadInt32());
reader.Dispose();
stream.Dispose();

【讨论】:

以上是关于mscorlib.dll 中出现了“System.ArgumentOutOfRangeException”类型的第一次机会异常的主要内容,如果未能解决你的问题,请参考以下文章

CAB安装程序无法复制System.dll,mscorlib.dll和mscorlib.tlb

“System.OutOfMemoryException”类型的异常在 mscorlib.dll 中发生,但未在用户代码中进行处理

在 mscorlib.dll 中发生 System.ExecutionEngineException'

如何修复mscorlib.dll中发生的''System.AggregateException'“

持续发生的 mscorlib.dll 中发生 System.Threading.ThreadAbortException

在 WPF C# 中保存图像时出现错误 System.UnauthorizedAccessException 在 mscorlib.dll 中发生