以下代码将始终抛出 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(),因为它会复制。
答案 0 :(得分:34)
Here是您正在使用的MemoryStream(byte[])
构造函数的文档。它具体说:
此构造函数不公开基础流。 GetBuffer抛出UnauthorizedAccessException。
您应该使用this构造函数,而不是publiclyVisible = true
。
答案 1 :(得分:6)
使用创建MemoryStream实例 一个公开可见的缓冲区,使用 MemoryStream,MemoryStream(Byte [], Int32,Int32,Boolean,Boolean),或 的MemoryStream(Int32)已。如果是当前的 流是可调整大小的,两个调用 如果方法不返回相同的数组 调整基础字节数组的大小 在电话之间。另外 信息,请参阅容量。
您需要使用不同的构造函数。
答案 2 :(得分:3)
添加其他人已经放在这里的内容......
让代码工作的另一种方法是将代码更改为以下行。
byte[] buf2 = ms.ToArray();
答案 3 :(得分:2)
您似乎使用的MemoryStream(array[])
与文档中提到的三个版本中的任何一个都不匹配。