23

以下代码总是会抛出 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)。

我不这样做吗?

PS我不想使用 ToArray() 因为那会复制。

4

4 回答 4

40

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

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

您应该改用构造函数,使用publiclyVisible = true.

于 2009-10-29T20:05:17.077 回答
8

检查MemoryStream.GetBuffer()的文档

要创建具有公开可见缓冲区的 MemoryStream 实例,请使用 MemoryStream、MemoryStream(Byte[]、Int32、Int32、Boolean、Boolean) 或 MemoryStream(Int32)。如果当前流是可调整大小的,那么如果在调用之间调整了基础字节数组的大小,则对该方法的两次调用不会返回相同的数组。有关其他信息,请参阅容量。

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

于 2009-10-29T20:05:38.740 回答
6

添加到其他人已经放在这里的东西......

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

byte[] buf2 = ms.ToArray();
于 2009-10-29T20:16:22.183 回答
3

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

于 2009-10-29T20:02:22.430 回答