下面的代码总是会抛出异常 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() 因为这会生成副本。
Here 是您正在使用的
MemoryStream(byte[])
构造函数的文档。它特别说:
此构造函数不会公开底层流。 GetBuffer 抛出 UnauthorizedAccessException。
MemoryStream(Byte[], Int32, Int32, Boolean, Boolean)
构造函数,以及 publiclyVisible = true
。
查看文档中的 MemoryStream.GetBuffer()
创建 MemoryStream 实例 公共可见的缓冲区,使用 内存流,内存流(字节[], Int32、Int32、布尔值、布尔值)或 内存流(Int32)。如果当前 流的大小是可调整的,对此进行两次调用 方法不返回相同的数组,如果 底层字节数组的大小已调整 通话之间。对于额外的 信息,请参阅容量。
您需要使用不同的构造函数。
添加其他人已经放入此处的内容...
让代码正常工作的另一种方法是将代码更改为以下行。
byte[] buf2 = ms.ToArray();
您似乎正在使用
MemoryStream(array[])
,它与文档中提到的三个版本中的任何一个都不匹配。