Передает Систему. Рисование. Битовый массив через ненадежные библиотеки классов?

У меня есть третья сторона dll, который генерирует Битовый массив, и передайте его ссылку обратно. Если я генерирую Систему. Windows. Медиа. Обработка изображений. BitmapSource из него сразу затем все подходит. Но если я сохраняю ссылку и позже (после нескольких секунд и многих вызовов функции), я пытаюсь генерировать Bitmapsource, я добираюсь

Система. AccessViolationException был не обработан пользовательским кодом
Message=Attempted для чтения или защищенная от записи память. Это часто - признак, что другая память повреждена. Источник = "Система. Рисование"

при выполнении:

System.Windows.Media.Imaging.BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
    bmp.GetHbitmap(),
    IntPtr.Zero,
    Int32Rect.Empty,
    System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());

Какие-либо подсказки о том, что идет не так, как надо здесь? Любые указатели будут полезны.Спасибо.

5
задан Allen Rice 12 March 2010 в 15:00
поделиться

2 ответа

У меня тоже была большая проблема с растровыми изображениями и нарушениями доступа. Я считаю, что происходит то, что некоторые конструкторы растровых изображений оставляют дескрипторы файлов открытыми, когда этого не следует делать. Таким образом, программа, которую вы запускаете, обнаруживает, что файлы используются, хотя этого не должно быть.

В конце концов я нашел решение: я делаю копию исходного растрового изображения, а затем удаляю оригинал. Вот мой код, который сохраняет разрешение исходного Bitmap:

Bitmap Temp = new Bitmap(inFullPathName);
Bitmap Copy = new Bitmap(Temp.Width, Temp.Height);
Copy.SetResolution(Temp.HorizontalResolution, Temp.VerticalResolution);
using (Graphics g = Graphics.FromImage(Copy))
{
     g.DrawImageUnscaled(Temp, 0, 0);
}
Temp.Dispose();
return Copy;

Очевидно, что для первой строки ваша будет Bitmap Temp = MyThirdPartyDLL.GetBitmap (); или что-то. Если вас не волнует разрешение, его можно упростить до:

Bitmap Temp = MyThirdPartyDLL.GetBitmap();
Bitmap Copy = new Bitmap(Temp, Temp.Width, Temp.Height);
Temp.Dispose();
return Copy;

После внесения этого изменения я смог выполнять все виды файлового ввода-вывода и т. Д., Отлично, надеюсь, вы сможете сделать то же самое.

3
ответ дан 14 December 2019 в 08:48
поделиться

Я думаю, это указывает на то, что дескриптор (ссылка на ресурс, управляемый операционной системой, а не .Net), возвращенный bmp.GetHBitmap больше недействителен - возможно, где-то был вызван Dispose или что-то в этом роде (хотя не обязательно вашим кодом).

Я бы рекомендовал использовать другой способ сохранения данных растрового изображения, который не зависит от дескрипторов - возможно, сразу же передать двоичные данные самого растрового изображения, а затем бросить ссылку на него.

4
ответ дан 14 December 2019 в 08:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: