Пример 1. Междоменное взаимодействие
с продвижением по ссылке
В первом примере статический метод
CreateDomain
типа
System.AppDomain
вызы-
вается, чтобы заставить CLR создать новый домен приложений в том же Windows-
процессе. Тип
AppDomain
предоставляет несколько перегруженных версий метода
617
Домены.приложений
CreateDomain
; я рекомендую вам изучить их и выбрать версию, которая больше
всего подойдет вам при написании кода создания нового домена. Моя версия этого
метода имеет три аргумента:
Строка
String
содержит значимое имя для нового домена. Я передаю ей зна-
чение
"AD #2"
.
Аргумент
System.Security.Policy.Evidence
содержит политику, которую
должна использовать среда CLR для вычисления набора разрешений для до-
мена. В этом аргументе я передаю значение
null
, чтобы новый домен прило-
жений наследовал тот же набор разрешений, что и родительский. Обычно для
создания защитной границы вокруг кода домена приложений конструируют
объект
System.Security.PermissionSet
, создают в нем необходимые объекты
разрешений (экземпляры типов, которые реализуют интерфейс
IPermission
),
а затем передают ссылку на результирующий объект
PermissionSet
перегру-
женной версии метода
CreateDomain
, принимающего
PermissionSet
.
Аргумент
System.AppDomainSetup
задает параметры конфигурирации, которые
среда CLR должна применить к новому домену. И здесь я передаю значение
null
,
чтобы новый домен приложения наследовал конфигурацию родительского. Что-
бы домен получил особую конфигурацию, надо создать объект
AppDomainSetup
,
задать его свойства требуемым образом, а затем передать в метод
CreateDomain
ссылку на результирующий объект
AppDomainSetup
.
Код метода
CreateDomain
создает новый домен в процессе. Этому домену при-
сваивается значимое имя, а также параметры защиты и конфигурации. У нового
домена есть собственная куча загрузчика, которая пока пуста, потому что в него
не загружено ни одной сборки. При создании домена среда CLR не создает в нем
никаких потоков; там не выполняется никакой код, пока вы явно не заставите поток
вызвать код домена приложений.
Теперь, чтобы получить экземпляр объекта в новом домене, надо сначала
загрузить туда сборку, а затем создать экземпляр определенного в этой сбор-
ке типа. Именно эти операции и выполняет открытый экземплярный метод
CreateInstanceAndUnwrap
класса
AppDomain
. Этому методу передаются два аргумен-
та: строка
String
, идентифицирующая сборку, которую следует загрузить в новый
домен (на нее ссылается переменная
ad2
), и строка
String
, содержащая имя типа,
экземпляр которого надо создать. Метод
CreateInstanceAndUnwrap
заставляет
вызывающий поток перейти из текущего домена в новый. Теперь поток (который
выполняет вызов
CreateInstanceAndUnwrap
) загружает указанную сборку в новый
домен, а затем просматривает таблицу метаданных с определениями типов сборки
в поисках указанного типа (
MarshalByRefType
). Обнаружив нужный тип, поток
вызывает конструктор
MarshalByRefType
без параметров и возвращается обратно
в основной домен, чтобы метод
CreateInstanceAndUnwrap
мог вернуть ссылку на
новый объект
MarshalByRefType
.
Do'stlaringiz bilan baham: |