以下代码将始终引发UnuthorizedAccessException(MemoryStream的内部缓冲区无法访问)。
byte[] buf1 = { 2, 3, 5, 7, 11 }; var ms = new MemoryStream(buf1); byte[] buf2 = ms.GetBuffer(); // exception will be thrown here
这是在一个普通的旧控制台应用程序,我正在作为pipe理员运行。 我无法想象更多的特权设置,我可以给这个代码。 那么为什么我不能在这个缓冲区? (如果没有人可以,GetBuffer方法有什么意义?)
MSDN文档说
要使用公开可见的缓冲区创buildMemoryStream实例,请使用MemoryStream,MemoryStream(array [],Int32,Int32,Boolean,Boolean)或MemoryStream(Int32)。
我不是那样做的吗?
PS我不想使用ToArray(),因为它做了一个副本。
这是您正在使用的MemoryStream(byte[])
构造函数的文档。 它具体说:
此构造函数不公开基础流。 GetBuffer引发UnauthorizedAccessException。
你应该使用这个构造函数publiclyVisible = true
。
检查MemoryStream.GetBuffer()的文档
要使用公共可见的缓冲区创建MemoryStream实例,请使用MemoryStream,MemoryStream(Byte [],Int32,Int32,Boolean,Boolean)或MemoryStream(Int32)。 如果当前流的大小可调整,则如果底层字节数组在调用之间调整大小,则对此方法的两次调用不会返回相同的数组。 有关更多信息,请参阅容量。
你需要使用不同的构造函数。
您似乎正在使用MemoryStream(array[])
不符合文档中提到的三个版本中的任何一个。
添加到其他人已经在这里…
让您的代码工作的另一种方法是将您的代码更改为以下行。
byte[] buf2 = ms.ToArray();