Рейтинговые книги
Читем онлайн Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 177 178 179 180 181 182 183 184 185 ... 407
консольного приложения по имени DefaultAppDomainApp. Модифицируйте файл Program.cs, поместив в него следующий код, который просто выводит подробные сведения о стандартном домене приложения с применением нескольких членов класса AppDomain:

using System;

using System.IO;

using System.Linq;

using System.Reflection;

using System.Runtime.Loader;

Console.WriteLine("***** Fun with the default AppDomain *****n");

DisplayDADStats();

Console.ReadLine();

static void DisplayDADStats()

{

  // Получить доступ к домену приложения для текущего потока.

  AppDomain defaultAD = AppDomain.CurrentDomain;

  // Вывести разнообразные статистические данные об этом домене.

  Console.WriteLine("Name of this domain: {0}",defaultAD.FriendlyName);

                  // Дружественное имя этого домена

  Console.WriteLine("ID of domain in this process: {0}",defaultAD.Id);

                  // Идентификатор этого процесса

  Console.WriteLine("Is this the default domain?: {0}",

    defaultAD.IsDefaultAppDomain());

                  // Является ли этот домен стандартным

  Console.WriteLine("Base directory of this domain: {0}",

    defaultAD.BaseDirectory);

                  // Базовый каталог этого домена

  Console.WriteLine("Setup Information for this domain:");

                  // Информация о настройке этого домена

  Console.WriteLine("tApplication Base: {0}",

    defaultAD.SetupInformation.ApplicationBase);

                  // Базовый каталог приложения

  Console.WriteLine("t Target Framework: {0}",

    defaultAD.SetupInformation.TargetFrameworkName);

                  // Целевая платформа

}

Ниже приведен вывод:

***** Fun with the default AppDomain *****

Name of this domain: DefaultAppDomainApp

ID of domain in this process: 1

Is this the default domain?: True

Base directory of this domain: C:GitHubBookscsharp8-wfCodeChapter_14

DefaultAppDomainAppDefaultAppDomainAppbinDebugnet5.0

Setup Information for this domain:

  Application Base: C:GitHubBookscsharp8-wfCodeChapter_14

    DefaultAppDomainApp

    DefaultAppDomainAppbinDebugnet5.0

    Target Framework: .NETCoreApp,Version=v5.0

Обратите внимание, что имя стандартного домена приложения будет идентичным имени содержащегося внутри него исполняемого файла (DefaultAppDomainApp.exe в этом примере). Кроме того, значение базового каталога, которое будет использоваться для зондирования обязательных внешних закрытых сборок, отображается на текущее местоположение развернутого исполняемого файла.

Перечисление загруженных сборок

С применением метода GetAssemblies() уровня экземпляра можно просмотреть все сборки .NET Core, загруженные в указанный домен приложения. Метод возвращает массив объектов типа Assembly (рассматриваемого в главе 17). Для этого вы должны импортировать пространство имен System.Reflection в свой файл кода (как делали ранее).

В целях иллюстрации определите в классе Program новый вспомогательный метод по имени ListAllAssembliesInAppDomain(). Он будет получать список всех загруженных сборок и выводить для каждой из них дружественное имя и номер версии:

static void ListAllAssembliesInAppDomain()

{

  // Получить доступ к домену приложения для текущего потока.

  AppDomain defaultAD = AppDomain.CurrentDomain;

  // Извлечь все сборки, загруженные в стандартный домен приложения.

  Assembly[] loadedAssemblies = defaultAD.GetAssemblies();

  Console.WriteLine("***** Here are the assemblies loaded in {0} *****n",

    defaultAD.FriendlyName);

  foreach(Assembly a in loadedAssemblies)

  {

    // Вывести имя и версию

    Console.WriteLine($"-> Name,

                      Version: {a.GetName().Name}:{a.GetName().Version}" );

  }

}

Добавив к операторам верхнего уровня вызов метода ListAllAssembliesInAppDomain(), вы увидите, что в домене приложения, обслуживающем вашу исполняемую сборку, используются следующие библиотеки .NET Core:

***** Here are the assemblies loaded in DefaultAppDomainApp *****

-> Name, Version: System.Private.CoreLib:5.0.0.0

-> Name, Version: DefaultAppDomainApp:1.0.0.0

-> Name, Version: System.Runtime:5.0.0.0

-> Name, Version: System.Console:5.0.0.0

-> Name, Version: System.Threading:5.0.0.0

-> Name, Version: System.Text.Encoding.Extensions:5.0

Важно понимать, что список загруженных сборок может изменяться в любой момент по мере написания нового кода С#. Например, предположим, что метод ListAllAssembliesInAppDomain() модифицирован так, чтобы задействовать запрос LINQ, который упорядочивает загруженные сборки по имени:

using System.Linq;

static void ListAllAssembliesInAppDomain()

{

  // Получить доступ к домену приложения для текущего потока.

  AppDomain defaultAD = AppDomain.CurrentDomain;

  // Извлечь все сборки, загруженные в стандартный домен приложения.

  var loadedAssemblies =

    defaultAD.GetAssemblies().OrderBy(x=>x.GetName().Name);

  Console.WriteLine("***** Here are the assemblies loaded in {0} *****n",

    defaultAD.FriendlyName);

  foreach(Assembly a in loadedAssemblies)

  {

    // Вывести имя и версию

    Console.WriteLine($"-> Name,

                      Version: {a.GetName().Name}:{a.GetName().Version}" );

  }

}

Запустив приложение еще раз, вы заметите, что в память также была загружена сборка System.Linq.dll:

** Here are the assemblies loaded in DefaultAppDomainApp **

-> Name, Version: DefaultAppDomainApp:1.0.0.0

-> Name, Version: System.Console:5.0.0.0

-> Name, Version: System.Linq:5.0.0.0

-> Name, Version: System.Private.CoreLib:5.0.0.0

-> Name, Version: System.Runtime:5.0.0.0

-> Name, Version: System.Text.Encoding.Extensions:5.0.0.0

-> Name, Version: System.Threading:5.0.0

Изоляция сборок с помощью контекстов загрузки приложений

Как вам уже известно, домены приложений представляют собой логические разделы, используемые для обслуживания сборок .NET Core. Кроме того, домен приложения может быть дополнительно разделен на многочисленные границы контекстов загрузки. Концептуально контекст загрузки создает область видимости для загрузки, распознавания и потенциально выгрузки набора сборок. По существу контекст загрузки .NET Core наделяет одиночный домен приложения возможностью установить "конкретный дом" для заданного объекта.

На заметку! Хотя понимать процессы и домены приложений довольно-таки важно, в большинстве приложений .NET Core никогда не потребуется работать с контекстами загрузки. Этот обзорный материал был включен в книгу только ради того, чтобы представить более полную картину.

Класс AssemblyLoadContext позволяет загружать дополнительные сборки в их собственные контексты. В целях демонстрации создайте новый проект библиотеки классов по имени ClassLibaryl и добавьте его к текущему решению. С использованием интерфейса командной строки .NET Core CLI выполните показанные ниже команды в каталоге, содержащем текущее решение:

dotnet new classlib -lang c# -n ClassLibrary1 -o .ClassLibrary1 -f net5.0

dotnet sln .Chapter14_AllProjects.sln add .ClassLibrary1

Затем добавьте в DefaultAppDomainApp ссылку на проект ClassLibrary1, выполнив следующую команду CLI:

dotnet add DefaultAppDomainApp reference ClassLibrary1

Если вы работаете в Visual Studio, тогда щелкните правой кнопкой мыши на узле решения в окне Solution Explorer, выберите в контекстном меню пункт AddNew Project (Добавить►Новый проект. В результате создается проект ClassLibrary1 и добавляется к решению. Далее добавьте ссылку на новый проект, щелкнув правой кнопкой мыши на имени проекта DefaultAppDomainApp и выбрав в контекстном меню пункт Add►References. Выбрать

1 ... 177 178 179 180 181 182 183 184 185 ... 407
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен бесплатно.

Оставить комментарий