Взаимодействие с доменами приложений
55C# --- Сборки .NET --- Взаимодействие с доменами приложений
При запуске исполняемого файла .NET среда CLR автоматически помещает его в используемый по умолчанию домен приложения внутри обслуживающего процесса. Это происходит автоматически и прозрачно, потому писать какой-то специальный код не понадобится. К используемому по умолчанию домену приложения можно получить доступ в своем приложении с применением статического свойства AppDomain.CurrentDomain. Затем можно привязываться к любым интересующим событиям и использовать любые желаемые методы и свойства AppDomain для проведения диагностики во время выполнения.
Имя используемого по умолчанию домена совпадает с именем обслуживаемого внутри него исполняемого файла, а значение базового каталога, которое будет использоваться для поиска требуемых внешних приватных сборок — с текущим месторасположением этого исполняемого файла.
С применением на уровне экземпляра метода GetAssemblies() можно просмотреть все сборки .NET, загруженные в заданный домен приложения. Этот метод будет возвращать массив объектов типа Assembly, который является членом пространства имен System.Reflection (и потому требует импорта этого пространства имен в файл кода C#).
Для получения уведомлений от CLR-среды при загрузке новой сборки в определенный домен приложения необходимо организовать обработку события AssemblyLoad. Это событие имеет тип делегата AssemblyLoadEventHandler, который может указывать на любой метод, принимающий System.Object в первом параметре и AssemblyLoadEventArgs — во втором.
Давайте рассмотрим пример взаимодействия с доменом приложений:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
InfoDomainApp();
Console.ReadLine();
}
static void InfoDomainApp()
{
// Получаем домен используемый по умолчанию
AppDomain defaultD = AppDomain.CurrentDomain;
Console.WriteLine("*** Информация о домене приложения ***\n");
Console.WriteLine("-> Имя: {0}\n-> ID: {1}\n-> По умолчанию? {2}\n-> Путь: {3}\n",
defaultD.FriendlyName,defaultD.Id,defaultD.IsDefaultAppDomain(),defaultD.BaseDirectory);
Console.WriteLine("Загружаемые сборки: \n");
// Извлекаем информацию о загружаемых сборках с помощью LINQ-запроса
var infAsm = from asm in defaultD.GetAssemblies()
orderby asm.GetName().Name
select asm;
foreach (var a in infAsm)
Console.WriteLine("-> Имя: \t{0}\n-> Версия: \t{1}",a.GetName().Name, a.GetName().Version);
}
}
}