Иллюстрированный самоучитель по Architecture .NET

Пример AppDomain (Прикладная область)

При выполнении примера AppDomain (Прикладная область) получается выдача, показанная на рис. 8.1.

Иллюстрированный самоучитель по Architecture .NET › Классы каркаса .NET Framework › Пример AppDomain (Прикладная область)
Рис. 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());
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.