Общие сведения о доменах приложений
Обновлен: Ноябрь 2007
Исторически сложилось так, что для разделения приложений, выполняющихся на одном компьютере, используются границы процессов. Каждое приложение загружается в отдельный процесс, который отделяет его от других приложений, выполняющихся на том же компьютере.
Приложения оказываются изолированными друг от друга, поскольку адреса в памяти привязаны к процессам; бессмысленно использовать в процессе указатель, передаваемый ему из другого процесса. Кроме того, прямые вызовы между процессами невозможны. Вместо этого необходимо использовать прокси, которые обеспечивают уровень косвенности.
Перед запуском управляемый код должен пройти процесс проверки (если администратор не даст разрешение пропустить проверку). В процессе проверки определяется, может ли код предпринимать попытки обращения к неверным адресам памяти или осуществлять другие действия, способные привести к нарушению правильной работы процесса, в котором выполняется этот код. Код, прошедший проверку, называется строго типизированным. Возможность проверки кода на строгую типизацию позволяет среде CLR обеспечивать такой же высокий уровень изоляции процессов друг от друга, как и при использовании границ процессов, но со значительно более низкими затратами по производительности.
Домены приложений предоставляют среде CLR более безопасные и гибкие блоки, которые могут использоваться для разделения отдельных приложений. В одном процессе можно запустить несколько доменов приложений с таким же уровнем изоляции, какой обеспечивают отдельные процессы, но без дополнительных издержек на межпроцессные вызовы или переключение между процессами. Возможность выполнения нескольких приложений в одном процессе значительно повышает масштабируемость серверов.
Изоляция приложений также играет важную роль в обеспечении безопасности. Так, например, можно запустить элементы управления нескольких веб-приложений в одном процессе обозревателя так, что эти элементы управления не смогут получить доступ к данным и ресурсам друг друга.
Изоляция приложений при помощи доменов приложений имеет следующие преимущества.
Сбои в одном из приложений не затронут прочие приложения. Поскольку строго типизированный код не может вызывать сбои в памяти, использование доменов приложений гарантирует, что код, выполняющийся в одном домене, не окажет воздействия на другие приложения процесса.
Можно прекратить выполнение отдельных приложений, не останавливая процесс целиком. Использование доменов приложений позволяет выгружать код, используемый отдельным приложением.
Примечание. Невозможно выгружать отдельные сборки или типы. Выгрузить можно только домен целиком.
Код, используемый одним приложением, не может иметь непосредственного доступа к коду или ресурсам другого приложения. В среде CLR эта изоляция реализована за счет запрета прямых вызовов между объектами в различных доменах приложений. Объекты, передаваемые от домена к домену, копируются или взаимодействуют через прокси. Если объект копируется, вызов этого объекта является локальным. То есть вызывающий и вызываемый объекты находятся в одном домене приложения. Если доступ к объекту осуществляется через прокси, осуществляется удаленный вызов объекта. В этом случае вызывающий и вызываемый объекты находятся в разных доменах приложений. При междоменных вызовах используется та же инфраструктура удаленных вызовов, что и при вызовах между двумя разными процессами или двумя разными компьютерами. Для правильной JIT-компиляции вызова метода метаданные используемого объекта должны быть доступны для обоих доменов приложений. Если вызывающий домен не имеет доступа к метаданным для вызванного объекта, компиляция может завершиться ошибкой с исключением типа System.IO.FileNotFound. Дополнительные сведения см. в разделе .NET Remoting. Механизм определения способов междоменного доступа для объекта зависит от объекта. Дополнительные сведения см. в разделе Класс MarshalByRefObject.
Поведение кода определяется границами приложения, в котором он выполняется. Другими словами, домен приложения предоставляет параметры конфигурации, такие как политики управления версиями приложения, местоположение удаленных сборок, к которым выполняется обращение, и сведения о том, где следует искать локальные сборки, загруженные в домен.
Разрешения, предоставленные коду, могут управляться доменом приложения, в котором выполняется этот код.