Глава.22 .Хостинг.CLR.и.домены.приложений
Для переопределения заданного по умолчанию времени в 5 и 2 минуты используй-
те виртуальный метод
InitializeLifetimeServices
типа
MarshalByRefObject
. До-
полнительную информацию по данной теме вы можете найти в SDK-документации
на .NET Framework.
Пример 2. Междоменное взаимодействие с продвижением по значению Этот пример похож на предыдущий. В нем точно так же создается второй домен
приложений. Затем вызывается метод
CreateInstanceAndUnwrap
для загрузки той
же сборки в новый домен и создания в нем экземпляра объекта
MarshalByRefType
.
Далее CLR создает для объекта представитель, и переменной
mbrt
(в основном до-
мене) присваивается ссылка на него. Теперь при помощи созданного представителя
я вызываю метод
MethodWithReturn
. Этот метод без параметров будет выполнен
в новом домене, а перед тем как вернуть ссылку на объект основному домену, он
создаст экземпляр типа
MarshalByValType
.
Тип
MarshalByValType
не является производным от
System.MarshalByRefObject
,
а значит, CLR не может определить тип представителя для создания его экземпляра;
то есть объект нельзя продвинуть по ссылке через границу домена.
Однако благодаря наличию у типа
MarshalByValType
настраиваемого атрибута
[Serializable]
метод
MethodWithReturn
может выполнить продвижение объекта
по значению. Сейчас мы поговорим о том, что происходит при продвижении объ-
екта по значению из одного домена (исходного) в другой (целевой). А дополни-
тельную информацию о механизмах сериализации и десериализации вы найдете
в главе 24.
Когда исходному домену нужно передать ссылку на объект в целевой домен
(или возвратить ссылку из целевого домена), CLR сериализует экземплярные
поля объекта в байтовый массив, который затем копируется. После этого CLR
десериализует байтовый массив в целевом домене. Это вынуждает CLR загрузить
в целевой массив сборку (если она еще не загружена), в которой определен десе-
риализованный тип. Далее CLR создает экземпляр типа и использует значения из
байтового массива для инициализации полей объекта так, чтобы они полностью
совпадали со значениями исходного объекта. Иначе говоря, CLR делает точную
копию исходного объекта в целевом домене. Затем метод
MethodWithReturn
воз-
вращает ссылку на эту копию; в результате наш объект оказывается продвинутым
по значению через границу домена.