Như những người khác đã đề cập, không có cách nào bạn có thể lưu trữ dữ liệu trong được quản lýbyte[]
mà không cần sao chép (với cấu trúc hiện tại bạn đã cung cấp *). Tuy nhiên, nếu bạn không thực sự cần cần nó nằm trong bộ đệm được quản lý, bạn có thể sử dụng các hoạt động unsafe
để làm việc trực tiếp với bộ nhớ không được quản lý. Nó thực sự phụ thuộc vào những gì bạn cần làm với nó.
Tất cả byte[]
và các loại tham chiếu khác được quản lý bởi Bộ gom rác CLR, và đây là những gì có trách nhiệm cấp phát bộ nhớ và deallocation khi nó không còn được sử dụng. Bộ nhớ được chỉ định bởi sự trở lại của GetBuffer
là một khối bộ nhớ không được quản lý được cấp phát bởi mã C++ và (chi tiết bộ nhớ/triển khai bộ nhớ sang một bên) về cơ bản hoàn toàn tách biệt với bộ nhớ được quản lý GC của bạn. Do đó, nếu bạn muốn sử dụng loại CLR được quản lý GC (byte[]
) để chứa tất cả dữ liệu hiện đang được lưu giữ trong bộ nhớ không được quản lý của bạn được chỉ bởi IntPtr
, nó cần được di chuyển (sao chép) vào bộ nhớ mà GC biết. Điều này có thể được thực hiện bằng cách Marshal.Copy
hoặc bằng một phương pháp tùy chỉnh sử dụng mã số unsafe
hoặc pinvoke hoặc những gì có bạn.
Tuy nhiên, điều đó tùy thuộc vào những gì bạn muốn làm. Bạn đã đề cập đến dữ liệu video của nó. Nếu bạn muốn áp dụng một số biến đổi hoặc bộ lọc cho dữ liệu, bạn có thể làm điều đó trực tiếp trên bộ đệm không được quản lý. Nếu bạn muốn lưu bộ đệm vào đĩa, bạn có thể làm điều đó trực tiếp trên bộ đệm không được quản lý.
Về chủ đề chiều dài, không có cách nào để biết độ dài của bộ đệm không được quản lý trừ khi hàm được cấp phát bộ đệm cũng cho bạn biết độ dài là bao nhiêu. Điều này có thể được thực hiện theo nhiều cách, như các nhà bình luận đã đề cập (trường đầu tiên của cấu trúc, ra paramtere trên phương pháp).
* Cuối cùng, nếu bạn có quyền kiểm soát mã C++, bạn có thể sửa đổi nó để nó không chịu trách nhiệm phân bổ bộ đệm mà nó ghi dữ liệu vào, và thay vào đó được cung cấp con trỏ tới bộ đệm được phân bổ. Sau đó, bạn có thể tạo được quản lýbyte[]
trong C#, được phân bổ theo kích thước theo yêu cầu của mã C++ và sử dụng loại GCHandle
để ghim và cung cấp con trỏ tới mã C++ của bạn.
Bạn chắc chắn nên sao chép dữ liệu vì 'IntPtr' trỏ vào * bộ nhớ không được quản lý *! – Yahia
Cảm ơn bạn đã trả lời rất nhanh, nhưng IntPtr đó đã được trả về từ chức năng xuất C++, vì vậy tôi có thể quản lý và xóa nó ở bất cứ đâu mà tôi muốn. Tôi không muốn sao chép dữ liệu vì dữ liệu là bộ đệm video, vì vậy nó rất lớn. Sao chép sẽ làm cho hiệu suất kém. Cảm ơn bạn! – TTGroup
Đó thực sự là không có lý do để đi cho thực hành không an toàn ... bạn thực sự cần sao chép nội dung - có một số phương pháp an toàn để làm như vậy (nhanh hơn những người khác) ... – Yahia