Пример AppDomain (Прикладная область)
Необходимо отметить, что в результате вызова метода Createlnstance происходит вызов конструктора, который выполняется в новой прикладной области и поэтому в контексте, отличном от того, в котором был сделан вызов Createlnstance. Однако выполнение этого вызова происходит в том же потоке, в котором был сделан вызов Createlnstance.
Когда мы составляем список клиентов в этом новом объекте, мы получаем другой список клиентов. И не удивительно, ведь это другой объект Customers (Клиенты). Тем не менее, метод составления списка клиентов выполняется в заданной по умолчанию прикладной области.
Используя RemotingServices::IsTransparentProxy, можно увидеть, что ObjectHandle – это заместитель объекта Customers (Клиенты) в новой созданной прикладной области (AppDomain). Однако, если попытаться распаковать объект, чтобы получить дескриптор экземтяра, то в результате мы получим не указатель на заместитель, а фактическую объектную ссылку. По умолчанию, объекты передаются по значению (копируются) из одной прикладной области в другую.
Если объект Customers (Клиенты) – нельзя сериализовать (преобразовать в последовательную форму), то при попытке его скопировать будет запущено исключение. Это исключение появляется при вызове метода Unwrap (Развернуть), а не Createlnstance. Последний метод возвращает ссылку Копирование происходит только в том случае, если объект ObjectHandle распакован. Если же объект не может быть преобразован в поспедовательную форму, он не может быть скопирован из одной прикладной области в другую.
На следующем шаге будет создан новый поток, который создаст новую прикладную область, куда затем загружается и где выполняется какая-нибудь сборка. Сборка начинает выполняться со своей точки входа – подпрограммы Маin (Главная) класса.
AppDomainTest AppDomain *domain = AppDomain::CreateDomain("CreatedDomain2", 0, 0); String * args[] = new String *[!]; // Строка * параметры [] = новая Строка * [1]; args[0] = "MakeReservation"; // параметры [О] int val = domain › ExecuteAssembly( "TestApp\\bin\\Debug\\TestApp.exe", 0, args); // параметры AppDomain::Unload(domain);
Подпрограмма Main (Главная) загружает сборку Hotel (Гостиница) в созданную прикладную область. В этом примере приложение TestApp.exe реализовано на С#. После загрузки оно запрашивает метаданные сборки для получения информации о типе HotelBroker. Затем эта информация используется для создания объекта HotelBroker. Класс HotelBroker помечен атрибутом синхронизации. В результате конструктор HotelBroker и метод MakeReservation работают в контексте, отличном от заданного по умолчанию.
Assembly a = AppDomain.CurrentDomain.Load("Hotel"); // Сборка – Загрузить ("Гостиница"); Type typeHotelBroker = а.GetType("01. NetCpp.Acme.HotelBroker"); HotelBroker hotelBroker = (HotelBroker)Act vator.CreateInstance(typeHotelBroker); DateTime date = Date Time.Parse("12/2/2001"); // дата = DateTime. Синтаксический анализ ("12/2/2001"); ReservationResult rr = hotelBroker.MakeReservation(1, "Boston", "Sheraton", date, 3); // "Бостон", "Шератон", дата, 3); Console.WriteLine("\tReservation Id: {0}", // Идентификатор rr.Reservationld);