2013-02-15 2 views
1

Я загружаю dll, которая порождает несколько потоков внутри себя. Время от времени программа вылетает с необработанным исключением. Я не могу обернуть все мои вызовы библиотеки в операторах try/catch, потому что исключения отбрасываются на отдельные потоки, и у меня нет доступа к источнику библиотеки для отладки/исправления неправильной обработки ошибок. Я хотел бы, чтобы программа продолжала делать другие вещи, когда происходят эти исключения, есть ли изящный способ справиться с этими исключениями? Или это единственное, что я могу сделать, чтобы сделать глобальный метод исключения всех исключений?Как справиться с исключениями в отдельных потоках во внешней dll?

+1

Если бы это было возможно, w3wp.exe не потерпит крах, если у вас было необработанное исключение в отдельном потоке. Произошло несколько раз с моим хостинг-провайдером уже ... – leppie

ответ

1

Если вы загружаете DLL в отдельный домен, вы должны иметь возможность изолировать исключения, сгенерированные с помощью AppDomain.UnhandledException, но имейте в виду, что это не является доказательством дурака, и есть определенные ситуации, когда он все равно будет обрабатывать ваш процесс и вы ничего не можете с этим поделать (переполнение стека, из памяти и т. д.).

Лучшее, что вы можете сделать в этом случае, полностью загружает их в отдельный процесс с помощью какого-либо коммуникационного устройства для связи с dll и использует некоторую форму удаленного взаимодействия с этим процессом.

1

Я бы рекомендовал реализовать отдельный процесс (EXE), который запускает ваше приложение и которое, в свою очередь, загружает DLL.

Это позволяет убить/перезапустить процесс всякий раз, когда это будет необходимо ...

Я вижу несколько вариантов, как общаться - например:

  • вы можете использовать COM (если вы его реализации как вне-процесс COM-сервер)
  • вы могли бы использовать общую память (очень высокую производительность, см this для пошагового и this для .NET 2 обертки)

ЕСЛИ метод должен быть совместим с несколькими версиями Windows. THEN Я бы воздержался от использования чего-либо «сетевого» для IPC (поскольку некоторые из них поставляются с настольным брандмауэром).

Смежные вопросы