2009-10-29 11 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、Boolean、Boolean)、または MemoryStream(Int32)。

私はそれをしていませんか?

P.S. ToArray()はコピーを作成するため、使用したくありません。

答えて

30

Hereは、使用しているMemoryStream(byte[])コンストラクタのドキュメントです。

このコンストラクタは、基本となるストリームを公開しません。 GetBufferはUnauthorizedAccessExceptionをスローします。

代わりにthisコンストラクタを使用してください(publiclyVisible = true)。

+0

tanx、great point –

2

MemoryStream(array[])は、ドキュメントに記載されている3つのバージョンのいずれとも一致していないようです。

+0

+1良い点、ありがとう –

3

のMemoryStream、のMemoryStream(バイト[]、 のInt32、のInt32、ブール、ブール値)、または のMemoryStreamを使用し、 で公開さバッファをMemoryStreamをインスタンスを作成するためにMemoryStream.GetBuffer()

ためのドキュメントをチェックします。 (Int32)。現在の ストリームがサイズ変更可能な場合、この メソッドへの2回の呼び出しでは、 の基本バイト配列が呼び出される間に のサイズに変更された場合、同じ配列が返されません。追加の については、「容量」を参照してください。

別のコンストラクタを使用する必要があります。他の人がすでにここに入れているものに追加するには

1

...仕事にあなたのコードを取得するには

もう一つの方法は、次の行にあなたのコードを変更しています。

byte[] buf2 = ms.ToArray(); 
関連する問題