Why does MemoryStream.GetBuffer() always throw?

I. J. Kennedy picture I. J. Kennedy · Oct 29, 2009 · Viewed 18.4k times · Source

The following code will always throw UnuthorizedAccessException (MemoryStream's internal buffer cannot be accessed.)

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

This is in a plain old console app and I'm running as an admin. I can't imagine a more privileged setting I could give this code. So why can't I get at this buffer? (And if nobody can, what's the point of the GetBuffer method?)

The MSDN docs say

To create a MemoryStream instance with a publicly visible buffer, use MemoryStream, MemoryStream(array[], Int32, Int32, Boolean, Boolean), or MemoryStream(Int32).

Am I not doing that?

P.S. I don't want to use ToArray() because that makes a copy.

Answer

Pavel Minaev picture Pavel Minaev · Oct 29, 2009

Here is the documentation for MemoryStream(byte[]) constructor that you're using. It specifically says:

This constructor does not expose the underlying stream. GetBuffer throws UnauthorizedAccessException.

You should use this constructor instead, with publiclyVisible = true.