Границы контекстов объектов
Выгрузка доменов приложений программным образом
Загрузка сборок в специальные домены приложений
CLR-среда будет всегда загружать сборки в используемый по умолчанию домен приложения по мере необходимости. Однако в случае создания вручную специальных доменов приложений, эти сборки можно загружать в данные домены с помощью метода AppDomain. Load () . Кроме того, существует метод AppDomain.ExecuteAssembly (), который позволяет загрузить сборку * . ехе и выполнить метод Main ().
Важно отметить, что выгружать отдельные сборки .NET в CLR-среде не разрешено. Однако с помощью метода App Domain. Unload () можно производить избирательную выгрузку определенного домена приложения из обслуживающего процесса. В этом случае вместе с доменом приложения будут выгружаться и все содержащиеся в нем сборки. Вспомните, что тип AppDomain имеет событие DomainUnload, которое срабатывает при выгрузке специального домена приложения из содержащего его процесса. Еще одним интересным событием является ProcessExit, которое срабатывает при выгрузке из процесса используемого по умолчанию домена (что, вполне очевидно, влечет за собой завершение самого процесса).
Выше было показано, что домены приложений представляют собой логические разделы внутри процесса, которые используются для обслуживания сборок .NET. Однако на этом дело не заканчивается, поскольку каждый домен приложения может быть дополнительно разделен на многочисленные контексты. Вкратце, контекст в .NET предоставляет возможность закреплять за конкретным объектом "определенное место" в одном домене приложения.
На заметку! Следует отметить, что если понимание концепции процессов и доменов приложений является довольно важным, то необходимость работы с контекстами объектов в большинстве приложений .NET возникает очень редко. Материал по контекстам объектов включен в настоящую главу лишь для предоставления более полной картины.
Используя контекст, CLR-среда обеспечивает надлежащую и согласованную обработку объектов, которые предъявляют специальные требования к этапу выполнения. Она перехватывает вызовы методов, производимых внутри и за пределами конкретного контекста. Этот уровень перехвата позволяет CLR-среде подстраивать текущий вызов метода так, чтобы он соответствовал контекстным настройкам конкретного объекта. Например, в случае определения на С# класса, требующего автоматического обеспечения безопасности в отношении потоков (за счет использования атрибута [Synchronization]), CLR-среда будет создавать во время его размещения так называемый "синхронизированный контекст".