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

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

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

РЕДАКТИРОВАТЬ: Хороший существующий охват класса AppDomain вообще Я не понимаю Области приложений

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

(для краткости я решил сократить обсуждение таблицы страниц).

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

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

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

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

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

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

Ответ 4

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

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

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