Домены приложений .NET

45

В .NET исполняемые файлы не обслуживаются прямо внутри процесса Windows, как это происходит в случае традиционных неуправляемых приложений. Вместо этого они обслуживаются в отдельном логическом разделе внутри процесса, который называется доменом приложения (Application Domain — AppDomain). В единственном процессе может содержаться несколько доменов приложений, каждый из которых обслуживает свой исполняемый файл .NET. Такое дополнительное подразделение традиционного процесса Windows предоставляет ряд преимуществ, главные из которых описаны ниже:

Класс 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 Возникает при отсутствии обработчика, способного перехватить данное исключение
Пройди тесты
Лучший чат для C# программистов