Прикладная область. Прикладные области и сборки.
Прикладная область .NET (Application Domain, иногда называемая AppDomain) – это более простой способ изоляции приложений, безопасный и устойчивый к ошибкам. В рамках одного процесса может находиться несколько прикладных областей. Поскольку в .NET код проверяется на типовую безопасность и защищенность, общеязыковая среда времени выполнения CLR гарантирует, что прикладная область может выполняться независимо от других прикладных областей в рамках одного процесса. Для изоляции приложения переключать процессы не требуется.
В прикладной области может быть несколько контекстов, но какой-нибудь отдельный контекст может существовать только в одной прикладной области. Поток в определенный момент может выполняться только в определенном контексте определенной прикладной области. Но, как показывают шаг 3 и шаг 4 примера Threading (Организация поточной обработки), поток, вообще говоря, может выполняться в различных контекстах (более чем в одном). Один или несколько потоков могут выполняться одновременно в рамках одной прикладной области. Какой-нибудь объект может существовать только в рамках одного контекста.
Каждая прикладная область создается вместе с одним потоком в пределах одного контекста. Дополнительные потоки и контексты, в которых они выполняются, создаются по мере необходимости.
Количество прикладных областей не зависит от количества потоков. Web-сервер может требовать создания отдельной прикладной области для запуска приложения на каждый сеанс соединения в рамках одного процесса. Потоков же в этом процессе может быть гораздо меньше, причем это зависит от того, сколько потоков реально сможет поддерживать процесс.
Чтобы изолировать приложения, код из одной прикладной области не должен непосредственно вызывать кода (или даже ссылаться на ресурсы) из других прикладных областей.
Прикладные области и сборки
Приложение компонуется из одной или нескольких сборок. Но каждая сборка загружается в какую-либо прикладную область. Каждая прикладная область может быть выгружена из памяти независимо от других. Однако нельзя выгрузить отдельную сборку из какой-либо прикладной области. Сборка может быть выгружена только вместе с прикладной областью. Выгрузка той или иной прикладной области из памяти освобождает также все ресурсы, ассоциированные с этой прикладной областью.
Каждый процесс по умолчанию содержит прикладную область, которая создается при запуске процесса. Эта создаваемая по умолчанию прикладная область может быть выгружена только с завершением работы процесса.
Для приложений, подобных ASP.NET или Internet Explorer, чрезвычайно важно (критично!) предотвратить взаимное вмешательство приложений, выполняющихся в рамках таких приложений. Код приложений никогда не загружается в прикладную область, создаваемую по умолчанию. Поэтому крах какого-либо из них не приведет к краху главного приложения.