Что такое a.NET домен приложения?
в частности, каковы последствия выполнения кода в двух разных доменах приложений?
Как обычно передаются данные через границу домена приложения? Это то же самое, что передача данных через границу процесса? Мне любопытно узнать больше об этой абстракции и для чего она полезна.
EDIT: хорошее существующее покрытие класса AppDomain в целом в Я не понимаю Домены приложений
4 ответа:
An AppDomain в основном предоставляет изолированную область, в которой код выполняется внутри процесса.
простой способ думать об этом почти как более легкий процесс, сидящий внутри вашего основного процесса. Каждый домен приложения существует внутри процесса в полной изоляции, что позволяет безопасно запускать код (он может быть выгружен без разрушения всего процесса, если это необходимо), с отдельной безопасностью и т. д.
Что касается вашей специфики - если вы запускаете код в 2 различные домены приложений внутри процесса, код будет работать в изоляции. Любая связь между доменами приложений будет либо сериализована, либо обработана через MarshallByRefObject. Он ведет себя очень похоже на использование удаленного доступа в этом отношении. Это обеспечивает огромную безопасность - вы можете запускать код, которому не доверяете, и если он делает что-то неправильно, это не повлияет на вас.
есть еще много деталей в описании MSDN Применения.
Это слой изоляции, предоставляемый средой выполнения .NET. Таким образом, Домены приложений живут в процессе (1 процесс может иметь много доменов приложений) и имеют свое собственное виртуальное адресное пространство.
Домены приложений полезны, потому что:
- они дешевле, чем полные процессы
- они многопоточных
- вы можете остановить, не убивая все в процессе
- разделение ресурсов / config / etc
- каждое приложение домен работает на собственном уровне безопасности
Если вы посмотрите на него с точки зрения внутренних деталей процессора, он устанавливает другое значение для регистра сегмента кода (CS). регистр кода и CS:IP (указатель команд) - это тот, который выполняется процессором.
(Я выбрал для краткости обсуждение, связанное с таблицей страниц).
AppDomain отмечает эту границу. для безопасности кода.
причина предоставления этого фона заключается в том, чтобы уйти с вопросом такого рода: 1. как мы можем получить доступ ресурс в двух доменах приложений (да, используя каналы или некоторые другие механизмы совместного использования не напрямую, поскольку CS:IP не может быть установлен в какой-либо другой домен приложений. Это просто ОС, которая может это сделать. Не CLR)
может ли быть несколько потоков в домене приложения. Технически да, поскольку значение CS будет находиться в текущем процессе. вы можете изменить IP на что-то другое с помощью оператора jump (комбинация вызова функции/goto)
могут ли два потока в двух разных приложениях доменная связь (Нет. см. пункт 1.)
могут ли два потока в одном домене приложения взаимодействовать (да. см. пункт 2)
на несколько других комбинаций этих случаев можно было бы ответить небольшим знанием того, как работает CS:IP.
каждое приложение, запущенное в процессе, AppDomain также является легким процессом или мы можем сказать логическую единицу, которая имеет группу сборок (это контейнер, который содержит группу сборок), и это существует внутри процесса на уровне изоляции одного и того же процесса, это позволяет запускать несколько сборок в одном процессе и предотвращать их прямой доступ.
Запуск Приложения Dot Net В AppDomain: После запуска любого приложения dot net, Операционная система shell загрузить CLR в процесс и новый AppDomain был создан в том же процессе и загрузить все сборки в созданном AppDomain, теперь из кода AppDomain будет выполняться.
когда пользовательское приложение домен: Мы можем создать собственный домен приложений, теперь дело в том, в каком сценарии мы можем создать собственный домен приложений. Предположим, что время выполнения нам нужно добавить или удалить узлы без прерывания работы приложения, то мы можем создать собственный домен.