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


84

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

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

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


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

Упс, пропустил это. Это можно закрыть.
Люк,

Ответы:


80

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

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

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

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


Можете ли вы пояснить, что вы имеете в виду под «если что-то не так»?
Люк,

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

21

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.