2009-10-29 84 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,布爾,布爾)或 MemoryStream(Int32)。

我不這樣做嗎?

P.S.我不想使用ToArray(),因爲它創建了一個副本。

回答

30

Here是您正在使用的MemoryStream(byte[])構造函數的文檔。它特別說:

此構造函數不公開底層流。 GetBuffer引發UnauthorizedAccessException。

您應該使用this構造來代替,以publiclyVisible = true

+0

坦克,好點 – 2015-09-23 07:38:36

2

您似乎在使用MemoryStream(array[]),它與文檔中提到的三個版本中的任何一個都不匹配。

+0

+1好點,謝謝 – 2010-03-17 00:00:54

3

檢查文檔爲MemoryStream.GetBuffer()

要使用 創建一個MemoryStream實例的公開可見緩衝液,使用 的MemoryStream,MemoryStream的(字節[], 的Int32,的Int32,布爾值布爾值),或 MemoryStream的(Int32)已。如果當前的 數據流的大小可調整,則如果在調用之間調整 的底層字節數組的 ,則對此 方法的兩次調用不會返回相同的數組。有關其他 信息,請參閱容量。

您需要使用不同的構造函數。

1

要添加什麼別人已經在這裏放...

另一種方式讓你的代碼的工作就是改變你的代碼以下行。

byte[] buf2 = ms.ToArray(); 
相關問題