Объекты,
созданные одним доменом приложений, недоступны для кода дру-
гих доменов.
Когда код домена приложений создает объект, домен становится
«хозяином» этого объекта. Иначе говоря, время жизни объекта ограничивается
временем существования самого домена. Код другого домена может получить
доступ к объекту, только используя семантику
продвижения по ссылке
(marshal-
by-reference) или
по значению
(marshal-by-value). Тем самым обеспечивается
четкое разделение кода в домене приложений, так как код в одном домене не
может напрямую ссылаться на объект, созданный в другом домене. Такая изо-
ляция позволяет легко выгружать домены приложений из процесса без влияния
на работу других доменов.
Домены приложений можно выгружать.
CLR не поддерживает выгрузку от-
дельных сборок. Однако можно заставить CLR выгрузить домен приложений
со всеми содержащимися в нем в данный момент сборками.
610
Глава.22 .Хостинг.CLR.и.домены.приложений
Домены приложений можно индивидуально защищать.
При создании домену
приложений можно назначить набор разрешений, определяющий максимальные
права запущенных в нем сборок. Это позволяет хосту загружать код и быть уве-
ренным, что этот код не испортит или не прочитает важные структуры данных,
используемые самим доменом.
Домены приложений можно индивидуально настраивать.
Каждый домен име-
ет целый набор конфигурационных параметров. Они в основном определяют,
как среда CLR должна загружать сборки в домен. Существуют и параметры,
относящиеся к путям поиска, перенаправлению привязки к версиям, теневому
копированию и оптимизации загрузчика.
ВниМание
Windows.предоставляет.замечательную.возможность.запускать.каждое.приложение.
в.собственном.адресном.пространстве .Это.гарантирует,.что.код.одного.приложения.
не.получит.доступа.к.коду.и.данным.другого .Изоляция.процессов.предотвращает.
появления.брешей.в.системе.безопасности,.повреждение.данных.и.другие.непри-
ятности,.обеспечивая.надежность.Windows.и.работающих.в.этой.операционной.си-
стеме.приложений .К.сожалению,.создание.процесса.в.Windows.—.операция.очень.
ресурсоемкая .Win32-функция.CreateProcess.выполняется.медленно,.а.виртуализация.
адресного.пространства.процесса.требует.много.памяти
Однако.если.приложение.полностью.состоит.из.гарантированно.безопасного.
управляемого.кода,.который.к.тому.же.не.вызывает.неуправляемый.код,.можно.за-
пустить.несколько.управляемых.приложений.в.одном.Windows-процессе .Их.домены.
обеспечат.изоляцию,.необходимую.для.защиты,.конфигурирования.и.завершения.
отдельных.приложений
На рис. 22.1 показан отдельный Windows-процесс, в котором работает один
COM-сервер CLR, управляющий двумя доменами приложений (кстати, не суще-
ствует жестких ограничений на количество доменов приложений, которые могут
выполняться в одном Windows-процессе). У каждого такого домена есть собственная
куча загрузчика, ведущая учет обращений к типам с момента создания домена (эти
типы были подробно рассмотрены в главе 4). Каждому типу в куче загрузчика со-
ответствует таблица методов, строки которой указывают на код метода (если этот
метод хоть раз исполнялся, его код уже скомпилирован JIT-компилятором).
Кроме того, в каждый домен приложений загружены сборки. В первый (он же
основной) загружены три сборки:
MyApp exe
,
TypeLib dll
и
System dll
, во второй — две
сборки:
Wintellect dll
и
System dll
.
Обратите внимание, что сборка
System dll
загружается в оба домена. Если в обоих
доменах используется один тип из
System dll
, в их кучах загрузчика будут размещены
объекты одинаковых типов; память, выделенная под эти объекты, не используется
доменами совместно. Более того, когда код домена вызывает определенные в типе
методы, IL-код метода JIT-компилируется, а результирующий машинный код
привязывается к каждому домену в отдельности, то есть он не используется ими
совместно.
611
Домены.приложений
Windows-процесс
Домен приложений
Домен приложений
Сборки, нейтральные по отношению к доменам
Исполнительное ядро
MSCorEE.dll (оболочка совместимости) Clr.dll (среда CLR)
Do'stlaringiz bilan baham: |