У нас есть приложение Mono под Linux, которое выполняет обработку изображений для нескольких файлов.
Для этого мы (помимо всего прочего) используем System.Drawing, и по большей части он нам хорошо служит.Тем не менее, иногда мы сталкиваемся с изображением, которое приводит к сбою приложения - это сбой при нативном вызове, и он неуязвим для попытки перехвата.Упрощенно, вызов типа
System.Drawing.Image.FromFile(imagePath);
вызовет сбой.Сообщение об ошибке выглядит примерно так:
at (wrapper managed-to-native) System.Drawing.GDIPlus.GdipLoadImageFromFile (string,intptr&) <0xffffffff>
Это приводит к мгновенному завершению всего приложения.
Мы встречались с несколькими случаями, когда это происходит - поврежденные файлы GIF, неожиданные заголовки в файлах TIFF.- назвать несколько.Поскольку у нас нет контроля над источником изображений, нам просто придется иметь дело с возможными сбоями.
Вопрос: Я хотел бы выделить места, где мы используем GDI +(через System.Drawing) на ненадежных файлах, чтобы он мог благополучно завершиться аварийно, не убивая все приложение.
Я пытался сделать это с помощью отдельных доменов приложений, но я просто не могу остановить сбои.Вероятно, я делаю это неправильно!
Некоторая деталь: openSUSE 11.4 (x86_64), Mono версия 2.10.2, libgdiplus0 (пакет) 2.10-30.2, libtiff3 (пакет) 3.9.4-3.7.1
Обратите внимание, что определенные проблемы, с которыми мы столкнулись, были быстро устранены - см. Комментарии ниже.Вопрос все еще остается, хотя.
Мне бы хотелось как-то изолировать часть программы, чтобы она не сносила все целиком, но я боюсь, что единственный ответ - вызвать внешний процесс, как отмечено в ответе ниже.Я оставлю это как есть на некоторое время, а затем приму этот ответ!