Что такое AppDomain?


118

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

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

+4

http://stackoverflow.com/questions/665668/usage-of-appdomain-in-c Интересно, что на это отвечают те же ребята! 17 мар. 102010-03-17 22:04:18

  0

Дополнительное примечание: класс ApplicationManager находится поверх ВСЕХ приложений AppDomains. 08 янв. 112011-01-08 18:14:35

  0

http://stackoverflow.com/a/41410172/993672 ответил здесь 01 янв. 172017-01-01 15:28:43

104

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

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

боль вам нужно использовать Remoting и т.д.

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

+11

Одна маленькая (но важная) вещь, которую нужно отметить: AppDomains не покрывает потоки. 22 фев. 092009-02-22 13:04:38

  0

@ RüdigerStevens, что вы имеете в виду? 30 сен. 152015-09-30 11:53:03

+5

@AgentFire: Если какой-то код работает в каком-то потоке, а какой-то AppDomain вызывает код из другого AppDomain, то поток «пересекает» границу приложения и запускает код из этого другого AppDomain. Таким образом, потоки не принадлежат к определенным AppDomains ... хотя можно сказать, что поток «принадлежит» домену, из которого был создан код, из которого он был создан. Но поток может запускать код из любого AppDomain. 02 окт. 152015-10-02 16:04:46

  0

@ RüdigerStevens это на самом деле преимущество. 02 окт. 152015-10-02 18:37:20

+2

Как отметил @Marc, мысль о AppDomain как дополнительном слое изоляции - хорошая идея. Я хотел бы привести это в контекст: [Процесс> CLR> AppDomain> Сборка со статикой> Thread with stack]. Это означает, что процесс содержит среду выполнения Common Language Runtime (CLR). CLR имеет один или несколько приложений AppDomains. Каждый AppDomain загружает одну или несколько сборок. Каждая сборка имеет собственные статические varibales и один или несколько потоков. Каждый поток имеет собственный стек. 05 июл. 162016-07-05 23:31:06

  0

Я предполагаю, что это была бы абстракция, если бы потоки не были контекстно-агностическими, как это. также, если вы посмотрите на поток, как на какую-то машину, проходящую через поток управления, последовательно выполняя команды вдоль линии, вы увидите, что все равно, когда эта цепочка команд приведет его, будь то тот же самый домен, в котором он был запущен, или другой. все команды выглядят одинаково и обрабатываются одинаково, где бы они ни находились «физически». понятие происхождения команды ортогонально тому, что поток i и делает в своем одномерном мире. хе. 01 авг. 172017-08-01 06:46:59


31

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

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

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

  0

Только одно примечание. Интернированные строки, похоже, не разделены между различными приложениями 16 дек. 142014-12-16 08:40:57


41

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

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

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

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

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

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

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

  0

Ну, я был немного смущен между вашим утверждением ** Отдельные AppDomains не разделяют пространство памяти ** и @Brian Rasmussen ** AppDomains являются частью одного и того же процесса и, таким образом, фактически разделяют ту же управляемую кучу **. Вы можете немного уточнить? 18 авг. 162016-08-18 02:39:12

  0

Когда AppDomains являются частью одного и того же процесса Windows (и, следовательно, в том же экземпляре среды .NET.), Они обязательно будут находиться в одной и той же управляемой куче упомянутого процесса Windows; однако это обстоятельство обычно будет невидимым для приложения .Net. Помните, что .Net-приложение не является приложением Windows Process и фактически работает в виде виртуальной машины. 18 авг. 162016-08-18 07:19:05