Домены приложений .NET
45C# --- Сборки .NET --- Домены приложений .NET
В .NET исполняемые файлы не обслуживаются прямо внутри процесса Windows, как это происходит в случае традиционных неуправляемых приложений. Вместо этого они обслуживаются в отдельном логическом разделе внутри процесса, который называется доменом приложения (Application Domain — AppDomain). В единственном процессе может содержаться несколько доменов приложений, каждый из которых обслуживает свой исполняемый файл .NET. Такое дополнительное подразделение традиционного процесса Windows предоставляет ряд преимуществ, главные из которых описаны ниже:
Домены приложений играют ключевую роль в обеспечении нейтральности платформы .NET по отношению к операционной системе из-за того, что такое логическое разделение стирает отличия в способе представления загружаемого исполняемого файла лежащей в основе операционной системой.
Домены приложений являются гораздо менее дорогостоящими в плане потребления вычислительных ресурсов и памяти по сравнению с полноценными процессами. Благодаря этому CLR-среде удается загружать и выгружать домены приложений намного быстрее, чем формальные процессы, и тем самым значительно улучшать масштабируемость серверных приложений.
Домены приложений обеспечивают более глубокий уровень изоляции для обслуживания загружаемого приложения. В случае выхода из строя какого-то одного домена приложения внутри процесса, остальные домены приложений все равно остаются работоспособными.
Класс System.AppDomain
Платформа .NET позволяет программно осуществлять мониторинг доменов приложений, создавать новые домены приложений (или выгружать их) во время выполнения, загружать в домены приложений различные сборки и решать целый ряд других задач с применением класса AppDomain из пространства имен System, которое находится в сборке mscorlib.dll. Ниже перечислены наиболее полезные методы этого класса:
- CreateDomain()
Этот статический метод позволяет создавать новый домен приложения в текущем процессе
- CreateInstance()
Этот метод позволяет создавать экземпляр типа из внешней сборки после загрузки соответствующей сборки в вызывающий домен приложения
- ExecuteAssembly()
Этот метод позволяет запускать сборку *.ехе внутри домена приложения за счет предоставления имени ее файла
- GetAssemblies()
Этот метод позволяет узнать, какие сборки .NET были загружены в данный домен приложения (двоичные файлы СОМ и С игнорируются)
- GetCurrentThreadId()
Этот статический метод возвращает идентификатор потока, который является активным в текущем домене приложения
- Load()
Этот метод применяется для динамической загрузки сборки в текущий домен приложения
- Unload()
Этот статический метод позволяет выгрузить определенный домен приложения из конкретного процесса
Платформа .NET не позволяет производить выгрузку конкретной сборки из памяти. Единственным способом для осуществления выгрузки библиотек программным образом является разрушение обслуживающего домена приложения с помощью метода Unload().
Кроме того, класс AppDomain имеет свойства и поддерживает набор событий, которые могут быть полезны для проведения мониторинга за каким-то доменом приложения. Наиболее интересные свойства и события такого рода кратко описаны ниже:
- BaseDirectory
Позволяет извлечь путь к каталогу, который преобразователь адресов использует для поиска сборок
- CurrentDomain
Представляет собой статическое свойство и позволяет узнать домен приложения, используемый для выполняющегося в текущий момент потока
- FriendlyName
Позволяет получить дружественное имя текущего домена приложения
- MonitoringlsEnabled
Позволяет получить или установить значение, указывающее, должна ли работать функция мониторинга за использованием ресурсов ЦП и памяти для текущего процесса. После включения функции мониторинга для процесса отключить ее нельзя
- SetupInformation
Позволяет извлечь детали конфигурации определенного домена приложения, которые предоставляются в виде объекта AppDomainSetup
Событие | Описание |
AssemblyLoad | Возникает при загрузке сборки в память |
AssemblyResolve | Возникает, когда преобразователю адресов сборок не удается обнаружить место расположения требуемой сборки |
DomainUnload | Возникает перед началом выгрузки домена приложения из обслуживающего процесса |
FirstChanceException | Позволяет получать уведомление о том, что в домене приложения было сгенерировано какое-то исключение, перед началом выполнения CLR-средой поиска подходящего оператора catch |
ProcessExit | Возникает в используемом по умолчанию домене приложения тогда, когда его родительский процесс завершает работу |
UnhandledException | Возникает при отсутствии обработчика, способного перехватить данное исключение |