Для каких доменов используются приложения?
Я понимаю, что такое AppDomain, однако я не полностью понимаю использование для AppDomain.
Я участвую в большом сервере на основе С#/С++-приложения, и мне интересно, как использование AppDomains может улучшить стабильность/безопасность/производительность.
В частности:
- Я понимаю, что ошибка или фатальное исключение в одном домене не влияет на другие домены приложений, работающие в одном и том же процессе. Это также верно для неуправляемых исключений/С++, возможно, даже для кучного повреждения или других проблем с памятью.
- Как работает связь между приложениями?
- Как использование AppDomains отличается от простого нереста многих процессов?
Ответы
Ответ 1
Основной пример использования AppDomain - это среда, в которой размещается сторонний код, поэтому необходимо не просто динамически загружать сборки, но и выгружать их.
Невозможно разгрузить сборку отдельно. Поэтому вам нужно создать отдельный AppDomain для размещения всего, что может потребоваться для выгрузки. Затем вы можете утилизировать и восстанавливать весь AppDomain, если это необходимо.
Кстати, собственный код, развращающий кучу, не может быть защищен какой-либо особенностью CLR. В конечном итоге CLR реализуется изначально и имеет одно и то же адресное пространство. Таким образом, встроенный код в процессе может писать все внутренности CLR! Единственный способ изолировать плохо выполненный (т.е. Самый) собственный код - это фактическая изоляция процесса на уровне ОС. Запустите mutiple.exe-процессы и попросите их обмениваться данными через некоторый механизм IPC.
Ответ 2
Я настоятельно рекомендую Jeffrey Richter CLR Via С#. В частности, глава 21 подробно описывает назначение и использование AppDomains.
В ответ на ваши вопросы/вопрос:
-
AppDomains не защитит ваше приложение от неуправляемого кода изгоя. Если это проблема, вам, скорее всего, потребуется использовать полную изоляцию процесса, предоставляемую ОС.
-
Связь между AppDomains выполняется с использованием удаленного доступа .NET для обеспечения изоляции. Это может быть через маршал путем ссылки или маршала по семантике значений с компромиссом между производительностью и гибкостью.
-
AppDomains - это легкий способ достижения процесса, такого как изоляция в управляемом коде. AppDomains считаются легкими, потому что вы можете создавать несколько приложений AppDomains в рамках одного процесса, и поэтому они избегают ресурса и производительности накладных нескольких процессов ОС. Кроме того, один поток может выполнять код в одном AppDomain, а затем в другом AppDomain, поскольку Windows ничего не знает о AppDomains (см. Это с помощью System.AppDomain.CurrentDomain)
Ответ 3
На самом деле, неверно, что критический сбой в одном AppDomain
не может повлиять на других. В случае с плохими вещами лучше всего сдержать процесс. Есть несколько примеров, но, честно говоря, я их не запомнил - я просто мысленно заметил "плохие вещи = срыв процесса (проверка)"
Преимущества AppDomain
:
- вы можете выгрузить
AppDomain
; Я использую это для системы, которая компилирует себя (метапрограммирование) на основе данных из базы данных - она может развернуть appdomain для размещения новой dll на некоторое время, а затем безопасно поменять ее, когда новые данные будут доступны (и построены)
- обмен между
AppDomain
относительно дешев. IMO это единственный раз, когда я счастлив использовать удаленный доступ (хотя вам все равно нужно быть действительно осторожно об объектах на границе, чтобы избежать ссылок на кровоточивость между ними, в результате чего "fusion" загружает дополнительные DLL в первичный AppDomain
, вызывающий утечку) - это тоже очень просто - просто CreateInstanceAndUnwrap
(или это CreateInstanceFromAndUnwrap
?).
- против отмены дополнительного процесса - вы можете пойти в любом случае; но вам не нужен другой exe для работы
AppDomain
, и гораздо проще настроить любые необходимые вам сообщения.
Ответ 4
Я не претендую на роль эксперта в AppDomains, поэтому мой ответ не будет всеобъемлющим. Возможно, мне следует начать с ссылки на отличное введение парня, который действительно оторвался как эксперт, и что-то вроде охватывающего все аспекты использования AppDomain.
Моя собственная главная встреча с AppDomains была в области безопасности. Там, самое большое преимущество, которое я нашел, - это способность иметь главный домен, выполняемый с высоким доверием, создавая несколько дочерних доменов с ограниченными разрешениями. Ограничивая разрешения с высоким доверием, без использования доменов приложений, у ограниченных процессов все равно будет разрешение на повышение своих собственных привилегий.
Ответ 5
Стратегия сегрегации App Domain для запуска полностью независимых модулей кода для решения проблем обмена памятью и стабильности - скорее иллюзия, чем реальность.