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

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

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

EDIT: Хороший существующий охват класса AppDomain в целом наЯ не понимаю домены приложений

 John Saunders07 июл. 2009 г., 22:07
Первая часть является дубликатомstackoverflow.com/questions/622516/i-dont-understand-appdomains, Может быть, вопрос должен быть отредактирован, чтобы передать данные.
 Luke07 июл. 2009 г., 22:20
Woops, пропустил тот. Это может быть закрыто.

Ответы на вопрос(4)

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

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

They are less expensive than full processes They are multithreaded You can stop one without killing everything in the process Segregation of resources/config/etc Each app domain runs on its own security level

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

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

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

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

(Для краткости я решил просмотреть обсуждение, связанное с таблицей страниц).

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

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

Could there be multiple threads in app domain. Technically yes as the CS value going to be in the current process. you can change IP to something else by a jump statement (function call/goto combination)

can two threads in two different app domain communicate (No. refer point 1.)

can two threads in single app domain communicate (Yes. refer point 2)

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

Решение Вопроса

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

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

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

В описании MSDN еще много подробностейДомены приложений.

 Luke07 июл. 2009 г., 22:07
Не могли бы вы уточнить, что вы подразумеваете под "если что-то не так"?
 07 июл. 2009 г., 22:17
Один пример: если у вас есть необработанный поток в пуле потоков, он разрушит домен приложения. Обычно это убивает ваш процесс, что опасно, если вы загружаете код пользователя или плагин. Запуск в отдельном домене приложений означает, что вы можете справиться с этим гораздо лучше - если нужно разрушить второй домен приложений, вы можете справиться с этим, не прерывая процесс.

Ваш ответ на вопрос