Для каких доменов используются приложения?

Я понимаю, что такое 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 для запуска полностью независимых модулей кода для решения проблем обмена памятью и стабильности - скорее иллюзия, чем реальность.