Что такое домен приложения .NET?

84

В частности, каковы последствия выполнения кода в двух разных доменах приложений?

Как данные обычно передаются через границу домена приложения? Это то же самое, что передача данных через границу процесса? Мне любопытно узнать больше об этой абстракции и о том, для чего она полезна.

EDIT: хорошее существующее покрытие класса AppDomain в целом, я не понимаю доменов приложений

Люк
источник
3
Первая часть является дубликатом stackoverflow.com/questions/622516/i-dont-understand-appdomains . Может вопрос стоит отредактировать, чтобы он касался передачи данных.
Джон Сондерс,
Упс, пропустил это. Это можно закрыть.
Люк,

Ответы:

80

AppDomain в основном обеспечивает изолированную область , в которой код работает внутри процесса.

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

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

В описании доменов приложений MSDN есть много других деталей .

Рид Копси
источник
Можете ли вы пояснить, что вы имеете в виду под «если что-то не так»?
Люк,
12
Один пример: если у вас есть необработанный поток в пуле потоков, он разорвет домен приложения. Обычно это убивает ваш процесс - что опасно, если вы загружаете пользовательский код или плагин. Запуск в отдельном домене приложения означает, что вы можете справиться с этим намного лучше - если второй домен приложения должен быть отключен, вы можете справиться с этим, не прерывая свой процесс.
Рид Копси,
21

Это уровень изоляции, обеспечиваемый средой выполнения .NET. Таким образом, домены приложений находятся в процессе (1 процесс может иметь несколько доменов приложений) и иметь собственное виртуальное адресное пространство.

Домены приложений полезны, потому что:

  • Они дешевле, чем полные процессы
  • Они многопоточные
  • Вы можете остановить одного, не убивая все в процессе
  • Разделение ресурсов / config / etc
  • Каждый домен приложения работает на собственном уровне безопасности
nikmd23
источник
1

Если вы посмотрите на это с точки зрения внутренних деталей процессора, он устанавливает другое значение для регистра сегмента кода (CS). code и регистр CS: IP (указатель инструкций) - это тот регистр, который выполняется процессором.

(Я решил для краткости просмотреть обсуждение, связанное с таблицей страниц).

AppDomain отмечает эту границу. для безопасности кода.

Причина для предоставления этого фона состоит в том, чтобы уйти от вопроса следующего вида: 1. Как мы можем получить доступ к ресурсу в двух доменах приложений (да, используя каналы или какой-либо другой механизм совместного использования, не напрямую, как CS: IP не может быть установлен для какого-либо другого домена приложения. Это может делать только ОС, а не среда CLR)

  1. Может ли быть несколько потоков в домене приложения. Технически да, поскольку значение CS будет в текущем процессе. вы можете изменить IP на что-то другое с помощью оператора перехода (комбинация вызова функции / перехода)

  2. могут ли взаимодействовать два потока в двух разных доменах приложения (№ см. пункт 1.)

  3. могут ли взаимодействовать два потока в одном домене приложения (Да, см. пункт 2)

На несколько других комбинаций этих случаев можно ответить, не зная, как работает CS: IP.

Зиаулла Хан
источник
0

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

Запуск приложения Dot Net внутри AppDomain: после запуска любого приложения dot net оболочка операционной системы загружает CLR в процесс, и новый AppDomain создается в том же процессе и загружает все сборки в созданный AppDomain, теперь из AppDomain будет выполняться код.

Когда использовать Custom AppDomain: мы можем создать собственный AppDomain, теперь дело в том, в каком сценарии мы можем создать собственный AppDomain. Предположим, во время выполнения нам нужно добавить или удалить сборки, не прерывая работающее приложение, тогда мы можем создать собственный домен приложений.

Афазал
источник