2009-07-07 3 views
73

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

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

EDIT: Хорошо существующий охват класса AppDomain в целом на I don't understand Application Domains

+3

Первая часть является дубликатом http://stackoverflow.com/questions/622516/i-dont-understand-appdomains. Может быть, вопрос должен быть отредактирован для передачи данных. –

+0

Вордс, пропустил тот. Это можно закрыть. – Luke

ответ

69

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

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

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

В описании MSDN Application Domains есть еще несколько деталей.

+0

Можете ли вы уточнить, что вы подразумеваете под «если он что-то не так»? – Luke

+8

Один пример: если у вас есть необработанный поток в threadpool, он разрушит домен приложения. Как правило, это убьет ваш процесс - что опасно, если вы загружаете пользовательский код или плагин. Запуск в отдельном appdomain означает, что вы можете справиться с этим намного лучше - если второй AppDomain должен быть снесен, вы можете справиться с этим, не срывая свой процесс. –

18

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

App домены полезны, потому что:

  • Они являются менее дорогостоящими, чем полные процессы
  • Они многопоточный
  • Вы можете остановить один, не убивая все, что в процессе
  • сегрегация ресурсов/конфигурации/etc
  • Каждый домен приложения работает на собственном уровне безопасности
0

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

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

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

1

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

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

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

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

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

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

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

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

Смежные вопросы