Мне не совсем понятна механика нативного взаимодействия.
Предположим, я делаю следующее:
IntPtr nativeArray = Marshal.AllocHGlobal(stride * height);
someNativeCallToFillRawImageData(nativeArray, width, stride, height);
return new Bitmap(width, height, stride, PixelFormat.Format24bppRgb, nativeArray);
Мой выделенный массив является источником растрового изображения (оно работает),но я не уверен, будет ли когда-нибудь очищена память для него?
В качестве альтернативы я могу сделать следующее (изменив сигнатуру DLLImport ... родной метод изначально определен как (unsigned char * buff)):
byte[] managedArray = new byte[stride * height];
someNativeCallToFillRawImageData(managedArray, width, stride, height);
fixed (byte* ptr = managedArray)
{
return new Bitmap(width, height, stride, PixelFormat.Format24bppRgb, new IntPtr(ptr));
}
, который также работает, но я не совсем точно понимаю разницу.У меня также сложилось впечатление, что первый вариант быстрее, поскольку ему не нужно пересекать управляемые / неуправляемые границы.
Располагает ли управляемый растровый объект данными в Scan0, даже если они были кем-то выделеныеще?bitmap.Dispose () -> что происходит с выделенной памятью в managedArray или nativeArray?
Заранее большое спасибо!