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

问题描述 投票:0回答:4

下面的代码总是会抛出异常 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 实例 公共可见的缓冲区,使用 内存流, 内存流(数组[],Int32, Int32、布尔值、布尔值),或 内存流(Int32)。

我不这样做吗?

附注我不想使用 ToArray() 因为这会生成副本。

windows exception memorystream getbuffer
4个回答
43
投票

Here 是您正在使用的

MemoryStream(byte[])
构造函数的文档。它特别说:

此构造函数不会公开底层流。 GetBuffer 抛出 UnauthorizedAccessException。

您应该使用

MemoryStream(Byte[], Int32, Int32, Boolean, Boolean)
构造函数,以及
publiclyVisible = true


8
投票

查看文档中的 MemoryStream.GetBuffer()

创建 MemoryStream 实例 公共可见的缓冲区,使用 内存流,内存流(字节[], Int32、Int32、布尔值、布尔值)或 内存流(Int32)。如果当前 流的大小是可调整的,对此进行两次调用 方法不返回相同的数组,如果 底层字节数组的大小已调整 通话之间。对于额外的 信息,请参阅容量。

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


6
投票

添加其他人已经放入此处的内容...

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

byte[] buf2 = ms.ToArray();

3
投票

您似乎正在使用

MemoryStream(array[])
,它与文档中提到的三个版本中的任何一个都不匹配。

© www.soinside.com 2019 - 2024. All rights reserved.