Шрифт:
Интервал:
Закладка:
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
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})dotnet sln .Chapter14_AllProjects.sln add .ClassLibrary1
Затем добавьте в DefaultAppDomainApp ссылку на проект ClassLibrary1, выполнив следующую команду CLI:
dotnet add DefaultAppDomainApp reference ClassLibrary1
Если вы работаете в Visual Studio, тогда щелкните правой кнопкой мыши на узле решения в окне Solution Explorer, выберите в контекстном меню пункт Add►New Project (Добавить►Новый проект. В результате создается проект ClassLibrary1 и добавляется к решению. Далее добавьте ссылку на новый проект, щелкнув правой кнопкой мыши на имени проекта DefaultAppDomainApp и выбрав в контекстном меню пункт Add►References. Выбрать Projects►Solution (Проекты►Решение), как показано на рис. 14.3.
Добавьте в новую библиотеку классов класс Car с таким кодом:
namespace ClassLibrary1
{
public class Car
{
public string PetName { get; set; }
public string Make { get; set; }
public int Speed { get; set; }
}
}
Теперь, имея новую сборку, добавьте необходимые операторы using:
using System.IO;
using System.Runtime.Loader;
Метод, добавляемый следующим, требует наличия операторов using для пространств имен System.IO и System.Runtime.Loader, которые вы уже добавили в Program.cs. Вот код этого метода:
static void LoadAdditionalAssembliesDifferentContexts()
{
var path =
Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
"ClassLibrary1.dll");
AssemblyLoadContext lc1 =
new AssemblyLoadContext("NewContext1",false);
var cl1 = lc1.LoadFromAssemblyPath(path);
var c1 = cl1.CreateInstance("ClassLibrary1.Car");
AssemblyLoadContext lc2 =
new AssemblyLoadContext("NewContext2",false);
var cl2 = lc2.LoadFromAssemblyPath(path);
var c2 = cl2.CreateInstance("ClassLibrary1.Car");
- Понимание SQL - Мартин Грубер - Базы данных