Почему MemoryStream.GetBuffer () всегда выбрасывает? - PullRequest
17 голосов
/ 29 октября 2009

следующий код всегда будет выбрасывать 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 (), потому что это делает копию.

Ответы [ 4 ]

34 голосов
/ 29 октября 2009

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

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

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

6 голосов
/ 29 октября 2009

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

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

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

3 голосов
/ 29 октября 2009

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

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

byte[] buf2 = ms.ToArray();
2 голосов
/ 29 октября 2009

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

...