Пример AppDomain (Прикладная область)
При выполнении примера AppDomain (Прикладная область) получается выдача, показанная на рис. 8.1.
Рис. 8.1. Выдача в примере AppDomain (Прикладная область)
Сначала выводится имя, поток и контекст прикладной области, заданной по умолчанию:
AppDomain *currentDomain = AppDomain:: CurrentDomam; Console::WriteLine( "At startup, Default AppDomain is {0} Threadld: {1} "При запуске по умолчанию AppDomain – {0} Threadld: {1} Contextld {2}\n", currentDomain › FrlendlyName, Thread::CurrentThread › GetHashCode().ToString(), Thread::CurrentContext › ContextID.ToString());
Затем загружается и выполняется сборка. Код из этой сборки только выводит строку, название прикладной области, в которую загружена сборка, а также название потока и контекста. Необходимо отметить, что все это выполняется в прикладной области, создаваемой по умолчанию:
int val = domain › ExecuteAssembly( "TestApp\\bin\\Debug\\TestApp.exe", 0, args); // параметры
Потом мы создадим экземпляр Customers (Клиенты) из сборки Customer (Клиент) в прикладной области, заданной по умолчанию. Метод Createlnstance класса AppDomain (Прикладная область) возвращает экземпляр ObjectHandle. Этот ObjectHandle можно передавать между прикладными областями без загрузки метаданных, ассоциированных с упакованным типом. Если нужно использовать созданный экземпляр объекта, его следует распаковать, вызвав метод Unwrap (Развернуть) для объекта ObjectHandle:
Objecthandle *on = currentDomain › Create!nstance( "Customer", "01. NetCpp.Acme.Customers"), // Клиент Customers *custs = // Клиенты dynamic_cast<Customers *>(oh › Unwrap ());
Затем мы добавляем нового клиента, а потом перечисляем всех существующих клиентов. Необходимо отметить, что и конструктор этого типа, и его методы выполняются в том же самом потоке и контексте, что и созданная по умолчанию прикладная область.
Далее мы создаем новую прикладную область, а в ней – экземпляр того же типа, что и раньше:
AppDomain *domain = AppDomain::CreateDomain( "CreatedDomainl", 0, 0); oh = domain › CreateInstance( "Customer", "01. NetCpp Acme.Customers"); // Клиент Customers *custs2 = dynamic_cast // Клиенты <Customers *>(oh › Unwrap());