23

次のコードは常に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)を使用します。

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

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

4

4 に答える 4

40

MemoryStream(byte[])使用しているコンストラクターのドキュメントは次のとおりです。具体的には次のように述べています。

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

代わりに、このコンストラクターを使用する必要がありますpubliclyVisible = true

于 2009-10-29T20:05:17.077 に答える
8

MemoryStream.GetBuffer()のドキュメントを確認してください

公開されているバッファを使用してMemoryStreamインスタンスを作成するには、MemoryStream、MemoryStream(Byte []、Int32、Int32、Boolean、Boolean)、またはMemoryStream(Int32)を使用します。現在のストリームのサイズが変更可能である場合、基になるバイト配列のサイズが呼び出し間で変更されると、このメソッドへの2つの呼び出しは同じ配列を返しません。詳細については、容量を参照してください。

別のコンストラクターを使用する必要があります。

于 2009-10-29T20:05:38.740 に答える
6

他の人がすでにここに入れているものに追加するには...

コードを機能させるもう1つの方法は、コードを次の行に変更することです。

byte[] buf2 = ms.ToArray();
于 2009-10-29T20:16:22.183 に答える
3

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

于 2009-10-29T20:02:22.430 に答える