Хороший пример использования AppDomain - PullRequest
46 голосов
/ 19 сентября 2008

Меня постоянно спрашивают о доменах приложений в интервью, и Я знаю основы :

  • это уровень изоляции в приложении (что отличает их от приложений)
  • они могут иметь темы (отличая их от потоков)
  • исключения в одном домене приложения не влияют на другой
  • домены приложений не могут получить доступ к памяти друг друга
  • каждый домен приложения может иметь разную защиту

Я до сих пор не понимаю, что делает их необходимыми. Я ищу разумное конкретное обстоятельство, когда вы бы его использовали.

Ответы:

  • Ненадежный код
  • Базовое приложение защищено
    Ненадежные / сторонние плагины защищены от повреждения разделяемой памяти и несанкционированного доступа к реестру или жесткому диску путем изоляции в отдельном домене приложений с ограничениями безопасности, защищая приложение или сервер. например Код компонента хостинга ASP.NET и SQL Server
Доверенный код
  • Стабильность
    Приложение сегментировано на безопасные, независимые функции / функциональность
  • Архитектурная гибкость
    Свобода запускать несколько приложений в одном экземпляре CLR или в каждой отдельной программе.

Что-нибудь еще?

Ответы [ 7 ]

49 голосов
/ 19 сентября 2008

Вероятно, наиболее распространенным является загрузка сборок, содержащих код плагина от ненадежных сторон. Код работает в своем собственном домене приложений, изолируя приложение.

Также невозможно выгрузить определенную сборку, но вы можете выгрузить домены приложений.

Для полного изложения у Криса Брамме была большая запись в блоге об этом:

http://blogs.msdn.com/cbrumme/archive/2003/06/01/51466.aspx

https://devblogs.microsoft.com/cbrumme/appdomains-application-domains/

14 голосов
/ 19 сентября 2008

Еще одним преимуществом доменов приложений (как вы упомянули в своем вопросе) является то, что загружаемый в него код может запускаться с различными разрешениями безопасности. Например, я написал приложение, которое динамически загружает библиотеки DLL. Я был инструктором, и это были студенческие библиотеки, которые я загружал. Я не хотел, чтобы какой-то недовольный студент стер мой жесткий диск или испортил мой реестр, поэтому я загрузил код из их библиотек DLL в отдельный домен приложений, у которого не было разрешений на ввод-вывод файлов, прав на редактирование реестра или даже разрешений на отображение новых окон (на самом деле он имел только разрешения на выполнение).

8 голосов
/ 19 сентября 2008

Я думаю, что основной мотивацией для наличия доменов приложений является то, что разработчики CLR хотели изолировать управляемый код без снижения производительности нескольких процессов Windows. Если бы CLR был изначально реализован поверх UNIX (где создание нескольких процессов значительно дешевле), домены приложений никогда бы не были изобретены.

Кроме того, хотя управляемые архитектуры подключаемых модулей в сторонних приложениях, безусловно, являются хорошим использованием доменов приложений, основная причина их существования - для известных хостов, таких как SQL Server 2005 и ASP.NET. Например, хостинг-провайдер ASP.NET может предложить решение для общего хостинга, которое поддерживает несколько сайтов от нескольких клиентов в одном окне, работающем под одним процессом Windows.

4 голосов
/ 19 сентября 2008

Насколько я понимаю, AppDomain разработаны так, чтобы предоставить хост-объекту (ОС, БД, Серверу и т. Д.) Свободу запуска нескольких приложений в пределах одного экземпляра CLR или каждой программы в отдельности. Так что это проблема для хоста, а не для разработчика приложения.

Это выгодно отличается от Java, где у вас всегда есть 1 JVM на приложение, что часто приводит к тому, что во многих случаях JVM работает параллельно с дублированными ресурсами.

4 голосов
/ 19 сентября 2008

Домены приложений отлично подходят для стабильности приложений.

Если ваше приложение состоит из центрального процесса, который затем порождает «функции» в отдельных доменах приложений, вы можете предотвратить глобальный сбой в случае неправильной работы одного из них.

4 голосов
/ 19 сентября 2008

Если вы создаете приложение, которое поддерживает сторонние плагины, вы можете загрузить эти плагины в отдельный домен приложений, чтобы защитить основное приложение от неизвестного кода.

ASP.NET также использует отдельные домены приложений для каждого веб-приложения в рамках одного рабочего процесса.

3 голосов
/ 19 февраля 2011

Я вижу 2 или 3 основных варианта использования для создания отдельных доменов приложений:

1) Процессоподобная изоляция с низким использованием ресурсов и накладными расходами. Например, это то, что делает ASP.NET - он размещает каждый веб-сайт в отдельном домене приложения. Если бы он использовал разные потоки в одном домене приложения, то код разных сайтов мог бы мешать друг другу. Если бы он размещал разные веб-сайты в разных процессах - он использовал бы много ресурсов, а также межпроцессное взаимодействие относительно сложно по сравнению с внутрипроцессным взаимодействием.

2) Выполнение ненадежного кода в отдельном домене приложения с определенными разрешениями безопасности (это фактически связано с 1-й причиной). Как уже говорили, вы можете загружать сторонние плагины или ненадежные библиотеки в отдельные домены приложений.

3) Возможность выгрузки сборок для уменьшения ненужного использования памяти. К сожалению, нет способа выгрузить сборку из домена приложения. Поэтому, если вы загружаете какую-то большую сборку в основной домен приложения, единственный способ освободить соответствующую память после того, как эта сборка больше не нужна, - это закрыть приложение. Загрузка сборок в отдельный домен приложения и выгрузка этого домена приложения, когда эти сборки больше не нужны, - это решение этой проблемы.

...