2009-10-29 12 views
13

El siguiente código siempre será tirar UnuthorizedAccessException (buffer interno de MemoryStream no se puede acceder.)¿Por qué MemoryStream.GetBuffer() siempre tira?

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

Se trata de una aplicación de consola simple y llano y estoy funcionando como administrador. No puedo imaginar un entorno más privilegiado en el que pueda dar este código. Entonces, ¿por qué no puedo llegar a este buffer? (Y si nadie puede, ¿cuál es el punto del método GetBuffer?)

La documentación de MSDN dicen

para crear una instancia MemoryStream con un búfer visible para el público, utilizar MemoryStream, MemoryStream (array [ ], Int32, Int32, Boolean, Boolean) o MemoryStream (Int32).

¿No estoy haciendo eso?

P.S. No quiero usar ToArray() porque eso hace una copia.

Respuesta

30

Here es la documentación del constructor MemoryStream(byte[]) que está utilizando. Específicamente dice:

Este constructor no expone la secuencia subyacente. GetBuffer arroja UnauthorizedAccessException.

En su lugar, debe usar this constructor, con publiclyVisible = true.

+0

tanx, great point –

2

Parece que está utilizando MemoryStream(array[]) que no coincide con ninguna de las tres versiones mencionadas en los documentos.

+0

+1 buen punto, gracias –

3

Verificar los docs para MemoryStream.GetBuffer()

Para crear una instancia MemoryStream con un tampón visible públicamente, utilice MemoryStream, MemoryStream (Byte [], Int32, Int32, Boolean, Boolean), o MemoryStream (Int32). Si la corriente actual es redimensionable, dos llamadas a este método no devuelven la misma matriz si la matriz de bytes subyacente se redimensiona entre llamadas. Para obtener información adicional sobre , consulte Capacidad.

Necesita usar un constructor diferente.

1

que añadir a lo que ya han puesto en aquí ...

Otra forma de obtener su código de trabajo es cambiar su código a la siguiente línea.

byte[] buf2 = ms.ToArray(); 
Cuestiones relacionadas