Язык программирования C#9 и платформа .NET5 - Джепикс Филипп - Страница 277
- Предыдущая
- 277/642
- Следующая
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 никогда не потребуется работать с контекстами загрузки. Этот обзорный материал был включен в книгу только ради того, чтобы представить более полную картину.
Класс
AssemblyLoadContextClassLibaryldotnet new classlib -lang c# -n ClassLibrary1 -o .\ClassLibrary1 -f net5.0dotnet sln .\Chapter14_AllProjects.sln add .\ClassLibrary1Затем добавьте в
DefaultAppDomainAppClassLibrary1dotnet add DefaultAppDomainApp reference ClassLibrary1Если вы работаете в Visual Studio, тогда щелкните правой кнопкой мыши на узле решения в окне Solution Explorer, выберите в контекстном меню пункт Add►New Project (Добавить►Новый проект. В результате создается проект
ClassLibrary1DefaultAppDomainApp
Добавьте в новую библиотеку классов класс
Carnamespace ClassLibrary1{ public class Car { public string PetName { get; set; } public string Make { get; set; } public int Speed { get; set; } }}Теперь, имея новую сборку, добавьте необходимые операторы
usingusing System.IO;using System.Runtime.Loader;Метод, добавляемый следующим, требует наличия операторов
usingSystem.IOSystem.Runtime.LoaderProgram.csstatic 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");- Предыдущая
- 277/642
- Следующая
