Что такое AppDomain?

Что такое AppDomain? Каковы преимущества AppDomains или почему Microsoft представила концепцию AppDomains, в чем проблема без AppDomains?

Просьба уточнить.

Ответ 1

An AppDomain обеспечивает слой изоляции внутри процесса. Все, что вы обычно думаете как "за программу" (статические переменные и т.д.), На самом деле является per-AppDomain. Это полезно для:

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

Боль в том, что вам нужно использовать удаленный доступ и т.д.

См. MSDN для получения дополнительной информации. Честно говоря, это не то, что вам нужно очень часто связываться.

Ответ 2

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

Отдельные AppDomains не разделяют пространство памяти, и, следовательно, один AppDomain не может напрямую ссылаться на содержимое в другом. В частности, данные должны передаваться между AppDomains посредством процесса копирования по значению. В частности, ссылочные объекты, которые полагаются на указатели и, следовательно, адреса памяти, сначала должны быть сериализованы из источника, а затем десериализации в целевой AppDomain.

Ранее в системах Windows границы памяти были реализованы процессами; однако, построение процессов является ресурсоемким. Они также служат двойной целью в качестве границ потоков. С другой стороны, домены приложений связаны только с границей памяти или адресным пространством. Потоки могут "перетекать" через AppDomains (т.е. Процедура может вызывать точку входа в другой AppDomain и ждать, пока она вернется. Поток говорит "продолжить" выполнение внутри другого AppDomain).

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

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

Примечание 2: существует такая вещь, как локальное хранилище потоков. Тем не менее, лучшим именем было бы локальное хранилище приложений App-Domain Thread, поскольку потоки оставляют свои данные позади, когда они пересекают App-Domains, но выбирают их обратно, когда они возвращаются: http://msdn.microsoft.com/en-us/library/6sby1byh.aspx

Примечание 3: Время выполнения .Net - это приложение Windows Process с связанной кучей. В этой куче может размещаться один или несколько приложений AppDomains. Тем не менее, AppDomains - это дизайн, который не обращает внимания друг на друга и связывается друг с другом посредством маршалинга. Можно предположить, что может быть выполнена оптимизация, которая обходит маршалинг между передачей AppDomains, использующей ту же самую .Net Runtime и, следовательно, ту же самую кучу Windows Process.

Ответ 3

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

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

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