2009-10-29 5 views
13

Следующий код всегда будет бросать UnuthorizedAccessException (внутренний буфер MemoryStream не может быть доступна.)Почему MemoryStream.GetBuffer() всегда выбрасывает?

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 (массив [ ], Int32, Int32, Boolean, Boolean) или MemoryStream (Int32).

Неужели я этого не делаю?

P.S. Я не хочу использовать ToArray(), потому что это делает копию.

ответ

30

Here - это документация для конструктора MemoryStream(byte[]), которую вы используете. В нем конкретно говорится:

Этот конструктор не раскрывает базовый поток. GetBuffer выбрасывает UnauthorizedAccessException.

Вместо этого вы должны использовать конструктор this, с publiclyVisible = true.

+0

tanx, отличная точка –

2

Возможно, вы используете MemoryStream(array[]), который не соответствует ни одной из трех версий, упомянутых в документах.

+0

+1 хорошая точка, спасибо –

3

Проверьте документацию для MemoryStream.GetBuffer()

Чтобы создать экземпляр MemoryStream с общедоступный буфер, используйте MemoryStream, MemoryStream (Byte [], Int32, Int32, Boolean, Boolean), или MemoryStream (Int32). Если текущий поток может быть изменен, два вызова этого метода не возвращают тот же массив, если изменен размер базового массива байтов между вызовами. Для дополнительной информации , см. Емкость.

Вам нужно использовать другой конструктор.

1

Чтобы добавить к тому, что другие уже поставили здесь ...

Другой способ, чтобы получить код для работы изменить код на следующей строке.

byte[] buf2 = ms.ToArray(); 
Смежные вопросы