Почему MemoryStream.GetBuffer() всегда бросает?

Следующий код всегда будет бросать 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 (массив [], Int32, Int32, Boolean, Boolean) или MemoryStream (Int32).

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

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

Ответ 1

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

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

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

Ответ 2

Проверьте документы для MemoryStream.GetBuffer()

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

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

Ответ 3

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

Ответ 4

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

Другой способ заставить ваш код работать - изменить свой код на следующую строку.

byte[] buf2 = ms.ToArray();