Я разрабатываю большое приложение, которое состоит из множества небольших плагинов/приложений.
Они недостаточно велики, чтобы быть полноценным процессом, но слишком малы для запуска в потоке, в рамках одного процесса, вместе с тем, что я хочу использовать его на основе плагина. Если доступна более новая версия этого плагина, она должна быть выгружена, обновлена и запущена снова.
Во время поиска решения я могу воспользоваться волшебным словом AppDomain, и я цитирую:
"Использовать домены приложений для изоляции задач, которые могут обработать. Если состояние AppDomain, выполняющего задачу, становится нестабильный, AppDomain может быть выгружен без ущерба для процесса. Это важно, когда процесс должен выполняться в течение длительного времени без повторный запуск. Вы также можете использовать домены приложений для изоляции задач, которые не должны делиться данными.
Таким образом, это именно то, что я хочу. Однако, я думаю, их "состояние становится неустойчивым" - это другая точка зрения, чем моя. Я думаю о проблеме, когда один из плагинов генерирует исключение по любой причине. Я бы хотел, чтобы это было уловлено, отправлено по электронной почте, выгружено и перезагружено (если возможно).
Итак, я создал приложение, которое запускается, ищет всю DLL в своей папке. Проверяет, содержит ли DLL плагин. Создает новый AppDomain для этого плагина, и как только все будет загружено, он запустит каждый плагин. (Где каждый плагин может состоять из нескольких потоков, совместное существование рядом с ech другим).
Итак, я также добавил тайм-аут, который срабатывает через 5 секунд, чтобы выбросить новый Exception(); Добавлено событие UnhandledException в AppDomain для его обработки. Но он поймал его, и после каттинга все еще "разбил" весь процесс, включая все дополнительные дочерние объекты AppDomains.
Но в цитате четко указано, что изолировать задачи, которые могут "сбить процесс". Так что я пропущу что-то жизненно важное? Является ли мой взгляд на цитату неправильным?