为什么MemoryStream.GetBuffer()总是抛出?

时间:2009-10-29 19:59:31

标签: windows exception memorystream getbuffer

以下代码将始终抛出 UnuthorizedAccessException(无法访问MemoryStream的内部缓冲区。)

byte[] buf1 = { 2, 3, 5, 7, 11 };
var ms = new MemoryStream(buf1);
byte[] buf2 = ms.GetBuffer();      // exception will be thrown here

这是一个普通的旧控制台应用程序,我作为管理员运行。我无法想象我可以给出这个代码更具特权的设置。那么为什么我不能进入这个缓冲区呢? (如果没有人可以,GetBuffer方法有什么意义?)

MSDN文档说

  

使用创建MemoryStream实例   一个公开可见的缓冲区,使用   MemoryStream的,   MemoryStream(array [],Int32,   Int32,Boolean,Boolean),或   的MemoryStream(Int32)已

我不这样做吗?

P.S。我不想使用ToArray(),因为它会复制。

4 个答案:

答案 0 :(得分:34)

Here是您正在使用的MemoryStream(byte[])构造函数的文档。它具体说:

  

此构造函数不公开基础流。 GetBuffer抛出UnauthorizedAccessException。

您应该使用this构造函数,而不是publiclyVisible = true

答案 1 :(得分:6)

查看MemoryStream.GetBuffer()

的文档
  

使用创建MemoryStream实例   一个公开可见的缓冲区,使用   MemoryStream,MemoryStream(Byte [],   Int32,Int32,Boolean,Boolean),或   的MemoryStream(Int32)已。如果是当前的   流是可调整大小的,两个调用   如果方法不返回相同的数组   调整基础字节数组的大小   在电话之间。另外   信息,请参阅容量。

您需要使用不同的构造函数。

答案 2 :(得分:3)

添加其他人已经放在这里的内容......

让代码工作的另一种方法是将代码更改为以下行。

byte[] buf2 = ms.ToArray();

答案 3 :(得分:2)

您似乎使用的MemoryStream(array[])与文档中提到的三个版本中的任何一个都不匹配。