2009-10-29 14 views
13

Poniższy kod będzie zawsze rzucać UnuthorizedAccessException (bufor wewnętrzny MemoryStream nie można otworzyć.)Dlaczego funkcja MemoryStream.GetBuffer() zawsze wyrzuca?

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

Jest to zwykły starej aplikacji konsoli i używam jako administrator. Nie mogę sobie wyobrazić bardziej uprzywilejowanego ustawienia, w którym mógłbym podać ten kod. Dlaczego nie mogę uzyskać tego bufora? (I jeśli nikt nie może, co jest punktem sposobu GetBuffer?)

Docs MSDN powiedzieć

Aby utworzyć egzemplarz MemoryStream z publicznie widoczne buforowego użyciu MemoryStream, MemoryStream (tablica [ ], Int32, Int32, Boolean, Boolean) lub MemoryStream (Int32).

Czy tego nie robię?

P.S. Nie chcę używać ToArray(), ponieważ tworzy kopię.

Odpowiedz

30

Here jest dokumentacją dla konstruktora MemoryStream(byte[]), którego używasz. W szczególności mówi:

Ten konstruktor nie ujawnia podstawowego strumienia. GetBuffer zgłasza wyjątek UnauthorizedAccessException.

Zamiast tego należy użyć konstruktora this, z publiclyVisible = true.

+0

tanx, świetny punkt –

2

Wygląda na to, że używasz MemoryStream(array[]), który nie pasuje do żadnej z trzech wersji wymienionych w dokumentach.

+0

+1 dobry punkt, dziękuję –

3

zobacz w dokumentacji MemoryStream.GetBuffer()

Aby utworzyć egzemplarz MemoryStream z publicznie widoczny bufor użyciu MemoryStream, MemoryStream (bajt [] Int32, Int32, wartości logicznej logiczny) lub MemoryStream (Int32). Jeśli bieżący strumień jest skalowalny, dwa wywołania tej metody nie zwracają tej samej tablicy, jeśli 01:podstawowa tablica bajtów jest zmieniana w rozmiarze między wywołaniami. Aby uzyskać dodatkowe informacje: , zobacz Pojemność.

Musisz użyć innego konstruktora.

1

Aby dodać do tego, co inni już umieścić tu ...

Innym sposobem uzyskania kodu do pracy jest zmienić swój kod do następnej linii.

byte[] buf2 = ms.ToArray(); 
Powiązane problemy