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

I. *_*edy 18 windows memorystream exception getbuffer

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

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

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

MSDN文档说

要使用公共可见缓冲区创建MemoryStream实例,请使用MemoryStream,MemoryStream(array [],Int32,Int32,Boolean,Boolean)或MemoryStream(Int32).

我不这样做吗?

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

Pav*_*aev 36

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

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

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

  • 如果您不想指定构造函数的所有参数,而只是想获取publiclyVisible参数,则可以仅将其与int32参数一起使用,如@Dolphin的答案中所指定。 (2认同)

Dol*_*hin 6

检查文档中的MemoryStream.GetBuffer()

若要创建具有公共可见缓冲区的MemoryStream实例,请使用MemoryStream,MemoryStream(Byte [],Int32,Int32,Boolean,Boolean)或MemoryStream(Int32)。如果当前流是可调整大小的,则在两次调用之间调整基础字节数组的大小时,对此方法的两次调用不会返回同一数组。有关更多信息,请参见容量。

您需要使用其他构造函数。


小智 5

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

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

byte[] buf2 = ms.ToArray();
Run Code Online (Sandbox Code Playgroud)