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