Как уже упоминалось, невозможно сохранить данные в управляемом byte[]
без копирования (с предоставленной вами текущей структурой *).Однако если вам на самом деле не нужно , чтобы он находился в управляемом буфере, вы можете использовать операции unsafe
для работы непосредственно с неуправляемой памятью.Это действительно зависит от того, что вам нужно с этим делать.
Все byte[]
и другие ссылочные типы управляются сборщиком мусора CLR, и это то, что отвечает за выделение памяти и освобождение, когда ее больше нет.используемый.Память, на которую указывает возвращение GetBuffer
, является блоком неуправляемой памяти, выделенной кодом C ++, и (за исключением схемы расположения / реализации памяти) по существу полностью отделена от управляемой памяти GC.Следовательно, если вы хотите использовать управляемый GC тип CLR (byte[]
) для хранения всех данных, которые в настоящее время хранятся в вашей неуправляемой памяти, на которую указывает ваш IntPtr
, его необходимо переместить (скопировать) в память, известную GC.около.Это можно сделать с помощью Marshal.Copy
или с помощью пользовательского метода с использованием кода unsafe
или пинвока или чего-либо еще.
Однако это зависит от того, что вы хотите с ним сделать.Вы упомянули, что это видео данные.Если вы хотите применить какое-либо преобразование или фильтр к данным, вы, вероятно, можете сделать это непосредственно в неуправляемом буфере.Если вы хотите сохранить буфер на диск, вы, вероятно, можете сделать это непосредственно в неуправляемом буфере.
Что касается длины, то нет способа узнать длину буфера неуправляемой памяти, кроме функции, котораяВыделенный буфер также говорит вам, какова длина.Это может быть сделано разными способами, как упоминали комментаторы (первое поле структуры, out-paramtere в методе).
* Наконец, если у вас есть контроль над кодом C ++, можно изменитьЭто так, что он не отвечает за выделение буфера, в который он записывает данные, и вместо этого ему предоставляется указатель на предварительно выделенный буфер.Затем вы можете создать managed byte[]
в C #, предварительно выделенный для размера, требуемого вашим кодом C ++, и использовать тип GCHandle
, чтобы закрепить его и предоставить указатель на вашКод C ++.