2009-10-29 13 views
13

Il seguente codice sarà sempre buttare UnuthorizedAccessException (buffer interno di MemoryStream non è possibile accedere.)Perché MemoryStream.GetBuffer() lancia sempre?

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

Questo è in una pianura vecchia console app e sto correndo come un amministratore. Non riesco a immaginare un'impostazione più privilegiata che potrei dare a questo codice. Quindi, perché non riesco a ottenere questo buffer? (E se nessuno può, qual è il punto del metodo GetBuffer?)

La documentazione MSDN dicono

per creare un'istanza MemoryStream con un buffer pubblicamente visibile, utilizzare MemoryStream, MemoryStream (array [ ], Int32, Int32, booleano, booleano) o MemoryStream (Int32).

Non lo faccio?

P.S. Non voglio usare ToArray() perché ne fa una copia.

risposta

30

Here è la documentazione per il costruttore MemoryStream(byte[]) che si sta utilizzando. Dice in particolare:

Questo costruttore non espone il flusso sottostante. GetBuffer lancia UnauthorizedAccessException.

Si dovrebbe usare this costruttore, invece, con publiclyVisible = true.

+0

tanx, ottimo punto –

2

Sembra che tu stia utilizzando MemoryStream(array[]) che non corrisponde a nessuna delle tre versioni menzionate nei documenti.

+0

+1 buon punto, grazie –

3

Controllare la documentazione per MemoryStream.GetBuffer()

Per creare un'istanza MemoryStream con un buffer pubblicamente visibile, utilizzare MemoryStream, MemoryStream (Byte [], Int32, Int32, Boolean, Boolean), o MemoryStream (Int32). Se lo stream corrente è ridimensionabile, due chiamate a questo metodo non restituiscono lo stesso array se l'array di byte sottostante viene ridimensionato tra tra le chiamate. Per ulteriori informazioni su , consultare Capacità.

È necessario utilizzare un costruttore diverso.

1

Per aggiungere a ciò che altri hanno già messo in qui ...

Un altro modo per ottenere il codice di lavoro è modificare il codice per la seguente riga.

byte[] buf2 = ms.ToArray(); 
Problemi correlati