Взаимодействие с доменами приложений

55

При запуске исполняемого файла .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);
        }
    }
}
Исследование домена приложения
Пройди тесты
Лучший чат для C# программистов