Шрифт:
Интервал:
Закладка:
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 в этом примере). Кроме того, значение базового каталога, которое будет использоваться для зондирования обязательных внешних закрытых сборок, отображается на текущее местоположение развернутого исполняемого файла.
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})Перечисление загруженных сборок
С применением метода 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, который упорядочивает загруженные сборки по имени:
- Понимание SQL - Мартин Грубер - Базы данных