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


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

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

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

4 74

4 ответа:

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

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

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

есть еще много деталей в описании MSDN Применения.

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

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

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

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

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

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

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

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

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

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

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

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

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

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