2009-10-29 30 views
13

Đoạn mã dưới đây sẽ luôn luôn ném UnuthorizedAccessException (đệm nội MemoryStream không thể được truy cập.)Tại sao MemoryStream.GetBuffer() luôn ném?

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

Đây là trong một ứng dụng giao diện điều khiển cũ đồng bằng và tôi đang chạy như một admin. Tôi không thể tưởng tượng ra một thiết lập đặc quyền hơn tôi có thể đưa ra mã này. Vậy tại sao tôi không thể lấy bộ đệm này? (Và nếu không ai có thể, điểm của phương pháp GetBuffer là gì?)

Các tài liệu MSDN nói

Để tạo một đối tượng với một bộ đệm hiển thị công khai MemoryStream, sử dụng MemoryStream, MemoryStream (array [ ], Int32, Int32, Boolean, Boolean) hoặc MemoryStream (Int32).

Tôi không làm điều đó?

P.S. Tôi không muốn sử dụng ToArray() vì nó tạo một bản sao.

Trả lời

30

Here là tài liệu dành cho hàm xây dựng MemoryStream(byte[]) mà bạn đang sử dụng. Cụ thể là:

Nhà xây dựng này không để lộ luồng cơ bản. GetBuffer ném UnauthorizedAccessException.

Thay vào đó, bạn nên sử dụng this hàm tạo, với publiclyVisible = true.

+0

tanx, điểm tuyệt vời –

2

Dường như bạn đang sử dụng MemoryStream(array[]) không khớp với bất kỳ phiên bản nào trong số ba phiên bản được đề cập trong tài liệu.

+0

+1 điểm tốt, cảm ơn –

3

Kiểm tra các tài liệu cho MemoryStream.GetBuffer()

Để tạo một đối tượng MemoryStream với một bộ đệm hiển thị công khai, sử dụng MemoryStream, MemoryStream (Byte [], Int32, Int32, Boolean, Boolean), hoặc MemoryStream (Int32). Nếu luồng hiện tại có thể thay đổi kích thước, hai cuộc gọi đến phương thức này không trả lại cùng một mảng nếu mảng byte cơ bản được định lại kích thước giữa các cuộc gọi. Để biết thêm thông tin , hãy xem Dung lượng.

Bạn cần sử dụng hàm tạo khác.

1

Để thêm vào những gì người khác đã đưa vào đây ...

Một cách khác để có được mã của bạn để làm việc là thay đổi mã của bạn để dòng sau.

byte[] buf2 = ms.ToArray(); 
Các vấn đề liên quan