Почему 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 (array [], Int32, Int32, Boolean, Boolean) или MemoryStream (Int32).

Я этого не делаю?

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


person I. J. Kennedy    schedule 29.10.2009    source источник


Ответы (4)


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

Этот конструктор не предоставляет базовый поток. GetBuffer выбрасывает исключение UnauthorizedAccessException.

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

person Pavel Minaev    schedule 29.10.2009
comment
Если вы не хотите указывать все параметры конструктора, просто чтобы перейти к параметру publiclyVisible, вы можете использовать тот, у которого есть только параметр int32, как указано в ответе @ Dolphin. - person Mladen B.; 24.04.2018

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

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

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

person Dolphin    schedule 29.10.2009

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

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

byte[] buf2 = ms.ToArray();
person Bomlin    schedule 29.10.2009

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

person Hyman Rosen    schedule 29.10.2009