При запуске приложения, написанного на C#, операционная система создает процесс, а среда CLR создает внутри этого процесса логический контейнер, который называется доменом приложения и внутри которого работает запущенное приложение.
Для управления домена платформа .NET предоставляет класс AppDomain . Рассмотрим некоторые основные методы и свойства данного класса:
- Свойство BaseDirectory : базовый каталог, который используется для получения сборок (как правило, каталог самого приложения)
- Свойство CurrentDomain : домен текущего приложения
- Свойство FriendlyName : имя домена приложения
- Свойство SetupInformation : представляет объект AppDomainSetup и хранит конфигурацию домена приложения
- Метод ExecuteAssembly() : запускает сборку exe в рамках текущего домена приложения
- Метод GetAssemblies() : получает набор сборок .NET, загруженных в домен приложения
Получим имя и базовый каталог текущего домена и выведем все загруженные в домен сборки:
Что такое домен (доменное имя) и для чего он нужен
using System.Reflection; AppDomain domain = AppDomain.CurrentDomain; Console.WriteLine($»Name: «); Console.WriteLine($»Base Directory: «); Console.WriteLine(); Assembly[] assemblies = domain.GetAssemblies(); foreach (Assembly asm in assemblies) Console.WriteLine(asm.GetName().Name);
Name: HelloApp Base Directory: /Users/eugene/Projects/HelloApp/HelloApp/bin/Debug/net6.0/ System.Private.CoreLib HelloApp System.Runtime System.Console System.Threading Microsoft.Win32.Primitives System.Collections System.Memory
Источник: metanit.com
Домены приложений
Операционные системы и среды выполнения обычно содержат определенные средства изоляции приложений друг от друга. Например, в ОС Windows для изоляции приложений используются процессы. Эта изоляция необходима, чтобы гарантировать, что код, выполняемый одним приложением, не сможет нарушить работу других, не связанных с ним приложений.
Домены приложений образуют изолированную область для безопасности, надежности, управления версиями и выгрузки сборок. Домены приложений обычно создаются базовыми средами выполнения, которые отвечают за начальную загрузку среды CLR перед запуском приложения.
Преимущества изоляции приложений
Исторически сложилось так, что для разделения приложений, выполняющихся на одном компьютере, используются границы процессов. Каждое приложение загружается в отдельный процесс, который отделяет его от других приложений, выполняющихся на том же компьютере.
Приложения оказываются изолированными друг от друга, поскольку адреса в памяти привязаны к процессам; бессмысленно использовать в процессе указатель, передаваемый ему из другого процесса. Кроме того, прямые вызовы между процессами невозможны. Вместо этого необходимо использовать прокси, которые обеспечивают уровень косвенности.
Перед запуском управляемый код должен пройти процесс проверки (если администратор не даст разрешение пропустить проверку). В процессе проверки определяется, может ли код предпринимать попытки обращения к неверным адресам памяти или осуществлять другие действия, способные привести к нарушению правильной работы процесса, в котором выполняется этот код. Код, прошедший проверку, называется типобезопасным. Возможность проверки кода на безопасность типа позволяет среде CLR обеспечивать такой же высокий уровень изоляции процессов друг от друга, как и при использовании границ процессов, но со значительно более низкими затратами по производительности.
Что такое домены? Как устроен интернет (5 из 13)
Домены приложений предоставляют среде CLR более безопасные и гибкие блоки, которые могут использоваться для разделения отдельных приложений. В одном процессе можно запустить несколько доменов приложений с таким же уровнем изоляции, какой обеспечивают отдельные процессы, но без дополнительных издержек на межпроцессные вызовы или переключение между процессами. Возможность выполнения нескольких приложений в одном процессе значительно повышает масштабируемость серверов.
Изоляция приложений также играет важную роль в обеспечении безопасности. Так, например, можно запустить элементы управления нескольких веб-приложений в одном процессе браузера так, что эти элементы управления не смогут получить доступ к данным и ресурсам друг друга.
Изоляция приложений при помощи доменов приложений имеет следующие преимущества.
- Сбои в одном из приложений не затронут прочие приложения. Поскольку типобезопасный код не может вызывать сбои в памяти, использование доменов приложений гарантирует, что код, выполняющийся в одном домене, не окажет воздействия на другие приложения процесса.
- Можно прекратить выполнение отдельных приложений, не останавливая процесс целиком. Использование доменов приложений позволяет выгружать код, используемый отдельным приложением.
Примечание Невозможно выгружать отдельные сборки или типы. Выгрузить можно только домен целиком.
Домены приложений и сборки
В этом разделе описывается связью между доменами приложений и сборками. Чтобы выполнить код сборки, ее необходимо загрузить в домен приложения. Как правило, для запуска приложения в домен приложения необходимо загрузить несколько сборок.
Способ загрузки определяет, можно ли использовать JIT-скомпилированный код сборки в нескольких доменах приложений в процессе и можно ли выгружать сборку из процесса.
- Если сборка загружается как нейтральная к домену, то все домены приложений с одним набором разрешений безопасности могут совместно использовать JIT-скомпилированный код, что снижает требуемый для приложения объем памяти. Однако сборку нельзя выгружать из процесса.
- Если сборка не загружается как нейтральная к домену, она должна быть JIT-скомпилирована в каждом домене приложения, в который она загружается. Однако сборку можно выгрузить из процесса, выгрузив все домены приложений, в которые она загружается.
Следует ли загружать сборки как нейтральные к домену, определяется в хост-приложении среды выполнения при загрузке среды выполнения в процесс. Для управляемых приложений примените атрибут LoaderOptimizationAttribute к методу точки входа процесса и укажите значение из связанного перечисления LoaderOptimization. Для неуправляемых приложений, в которых размещается среда CLR, при вызове функции CorBindToRuntimeEx задайте соответствующий флаг.
Существует три варианта загрузки нейтральных к домену сборок.
- LoaderOptimization.SingleDomain не загружает сборки как нейтральные к домену, за исключением Mscorlib, которая всегда загружается как нейтральная к домену. Этот вариант называется однодоменным, поскольку обычно он используется, когда в хост-приложении запускается только одно приложение в процессе.
- LoaderOptimization.MultiDomain загружает все сборки как нейтральные к домену. Этот вариант используется при наличии нескольких доменов приложений, в каждом из которых выполняется одинаковый код.
- LoaderOptimization.MultiDomainHost загружает сборки со строгими именами как нейтральные к домену, если они и все их зависимости установлены в глобальном кэше сборок. Другие сборки загружаются и JIT-компилируются отдельно для каждого домена приложения, в котором они загружаются, поэтому могут выгружаться из процесса. Этот вариант используется при работе нескольких приложений в одном процессе или при наличии набора сборок, которые являются общими для нескольких доменов приложений, и сборок, которые должны выгружаться из процесса.
JIT-скомпилированный код нельзя сделать общим для сборок, загруженных в контекст загрузки с помощью метода LoadFrom класса Assembly или загруженных из образов с помощью перегрузок метода Load, задающего байтовые массивы.
Сборки, которые были скомпилированы в машинный код с помощью Ngen.exe (средства для создания машинных образов), могут совместно использоваться доменами приложений, если они загружены как нейтральные к домену при первой загрузке в процесс.
JIT-скомпилированный код для сборки, содержащей точку входа приложения, может быть общим, только если все его зависимости могут использоваться совместно.
Сборка, нейтральная к домену, может JIT-компилироваться более одного раза. Например, когда наборы разрешений безопасности двух доменов приложений отличаются, они не могут совместно использовать один и тот же JIT-скомпилированный код. Однако каждая копия JIT-скомпилированной сборки может использоваться совместно с другими доменами приложений, имеющими такой же набор разрешений.
При принятии решения о том, следует ли загружать сборки как нейтральные, осуществляется компромисс между сокращением расхода памяти и производительностью.
- Доступ к статическим данным и методам для нейтральных к домену сборок осуществляется медленнее из-за необходимости изоляции сборок. Каждый домен приложения, обращающийся к сборке, должен обладать собственной копией статических данных, чтобы избежать ссылок на объекты в статических полях, пересекающих границы домена. В результате среда выполнения содержит дополнительные правила для перенаправления вызывающего объекта к соответствующей копии статических данных или метода. Эти дополнительные правила замедляют вызов.
- При загрузке сборки как нейтральной к домену необходимо найти и загрузить все зависимости сборки, поскольку зависимость, которую нельзя загрузить как нейтральную, не позволяет загрузить сборку как нейтральную.
Домены приложений и потоки
Домен приложения формирует изолированную область для безопасности, управления версиями, надежности и выгрузки управляемого кода. Поток представляет собой конструкцию операционной системы, используемую в среде CLR для выполнения кода. Во время выполнения весь управляемый код загружается в домен приложения и выполняется в одном или нескольких управляемых потоках.
Однозначного соответствия между потоками и доменами приложений не существует. В одном домене приложения могут одновременно выполняться несколько потоков, при этом конкретный поток не ограничен одним доменом приложения. Таким образом, потоки могут использоваться в разных доменах приложений. Новый поток для каждого домена приложения не создается.
В любой момент времени каждый поток выполняется в каком-либо домене приложения. В домене приложения может выполняться один или несколько потоков или не выполняться ни одного потока. Среда выполнения отслеживает соответствие потоков и доменов приложений, в которых они выполняются. В любой момент времени можно найти домен, в котором выполняется поток, вызвав метод Thread.GetDomain.
Домены приложений и язык и региональные параметры
Язык и региональные параметры, представляемые объектом CultureInfo, связаны с потоками. Чтобы получить язык и региональные параметры, связанные с выполняющимся в данный момент потоком, используйте свойство CultureInfo.CurrentCulture, а чтобы получить или задать язык и региональные параметры, связанные с выполняющимся в данный момент потоком, используйте свойство Thread.CurrentCulture. Если связанные с потоком язык и региональные параметры явно заданы с помощью свойства Thread.CurrentCulture, они будут связаны с этим потоком и за пределами домена приложения. В противном случае связанные с потоком язык и региональные параметры в любой момент времени определяются значением свойства CultureInfo.DefaultThreadCurrentCulture в домене приложения, где выполняется поток:
- Если значение этого свойства — не null , возвращаемые им язык и региональные параметры связаны с потоком (и следовательно возвращаются свойствами Thread.CurrentCulture и CultureInfo.CurrentCulture).
- Если значение этого свойства – null , с потоком связываются текущие настройки языка и региональных параметров системы.
Программирование с использованием доменов приложений
Домены приложений обычно создаются и управляются программно, хост-приложениями среды выполнения. Однако иногда работать с доменами приложений требуется самим приложениям. Например, приложение может загружать компонент в домен, чтобы иметь возможность выгрузить домен (и компонент) без необходимости останавливать все приложение.
AppDomain — это программный интерфейс для доменов приложений. Этот класс содержит методы для создания и выгрузки доменов, для создания экземпляров типов в доменах и для подписки на различные уведомления, такие как выгрузка домена приложения. В следующей таблице перечислены часто используемые методы AppDomain.
| CreateDomain | Создает новый домен приложения. Рекомендуется использовать перегрузку этого метода, в которой определяется объект AppDomainSetup. Это предпочтительный способ установки свойств нового домена, таких как база приложения или корневой каталог приложения, расположение файла конфигурации домена и путь поиска, используемый средой CLR для загрузки сборок в домен. |
| ExecuteAssembly и ExecuteAssemblyByName | Выполняет сборку в домене приложения. Это метод экземпляра, поэтому его можно использовать для выполнения кода в другом домене приложения, на который имеется ссылка. |
| CreateInstanceAndUnwrap | Создает экземпляр указанного типа в домене приложения и возвращает прокси. Этот метод служит для избежания загрузки сборки, содержащей созданный тип, в вызывающую сборку. |
| Unload | Корректно завершает работу домена. Домен приложения не выгружается до тех пор, пока все запущенные в домене потоки не будут остановлены или исключены из домена. |
Среда CLR не поддерживает сериализацию глобальных методов, поэтому для выполнения глобальных методов в других доменах приложений использовать делегаты нельзя.
Неуправляемые интерфейсы, описанные в спецификации Hosting Interfaces Specification для среды CLR, также предоставляют доступ к доменам приложений. Хост-приложения среды выполнения могут использовать интерфейсы из неуправляемого кода для создания доменов приложений внутри процесса и для получения доступа к ним.
Переменная среды COMPLUS_LoaderOptimization
Переменная среды, которая задает политику оптимизации загрузчика по умолчанию для исполняемого приложения.
Синтаксис
COMPLUS_LoaderOptimization = 1
Примечания
Стандартное приложение загружает в домен приложения несколько сборок. После этого можно выполнить содержащийся в них код.
Способ загрузки определяет, может ли JIT-скомпилированный код сборки использоваться несколькими доменами приложения в одном процессе.
- Если сборка загружается как независимая от домена, то все домены приложения с одним набором разрешений безопасности могут использовать один JIT-скомпилированный код. В этом случае приложение использует меньше памяти.
- Если сборка загружается как зависимая от домена, ее необходимо JIT-компилировать во всех соответствующих доменах приложения, при этом в каждом случае загрузчик должен использовать разные внутренние ресурсы.
Если значение флага среды COMPLUS_LoaderOptimization — 1, то хост-приложение среды выполнения использует способ загрузки SingleDomain. Он принудительно загружает все сборки как зависимые от домена, за исключением сборки Mscorlib, которая всегда загружается как независимая. Этот вариант называется однодоменным, поскольку обычно он используется, когда в хост-приложении запускается только одно приложение в процессе.
Флаг среды COMPLUS_LoaderOptimization предназначен для сценариев диагностики и тестирования. Когда он включен, работа может существенно замедляться, а использование памяти — увеличиваться.
Пример кода
Чтобы все сборки для службы IISADMIN загружались как зависимые от домена, добавьте код COMPLUS_LoaderOptimization=1 в многострочный параметр среды в разделе HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesIISADMIN.
Key = HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesIISADMIN Name = Environment Type = REG_MULTI_SZ Value (to append) = COMPLUS_LoaderOptimization=1
См. также
- System.AppDomain
- System.MarshalByRefObject
- Программирование с использованием доменов приложений и сборок
- Использование доменов приложений
Источник: learn.microsoft.com
Что такое домен Windows и каковы его преимущества?

Если вы используете компьютер на работе или в школе, он почти наверняка является частью домена Windows. Но что это на самом деле означает? Что делает домен, и каковы преимущества присоединения к нему компьютера?
Давайте посмотрим, что такое домен Windows, как они работают и почему компании используют их.
Что такое домен Windows?
Домен Windows по сути представляет собой сеть управляемых компьютеров, используемых в бизнес-среде. По крайней мере один сервер, называемый контроллером домена , отвечает за другие устройства. Это позволяет сетевым администраторам (обычно ИТ-персоналу) управлять компьютерами в домене с помощью пользователей, настроек и многого другого.

Поскольку домены не предназначены для домашних пользователей, в профессиональной версии Professional, имеется можно присоединиться к одному. Вам также понадобится копия Windows Server для контроллера домена, поскольку она включает в себя необходимое программное обеспечение, такое как Active Directory (подробнее об этом позже). Имейте в виду, что Windows Server отличается от Windows
Как вы знаете, если ваш компьютер находится в домене?
Если у вас есть домашний компьютер, очень маловероятно, что вы находитесь в домене. Вы можете создать домен в своей домашней сети, но в этом нет особого смысла. Но если вы используете компьютер, предоставленный вашей работой или школой, он почти наверняка находится в домене.

Чтобы проверить, является ли ваш компьютер частью домена, откройте панель управления и щелкните пункт « Система» . Посмотрите в разделе Имя компьютера . Если вы видите запись рабочей группы с WORKGROUP (по умолчанию) или другим именем в списке, ваш компьютер не принадлежит домену. Аналогично, если вы видите здесь « Домен» , значит, ваш компьютер находится в домене.
Эти шаги также позволяют вам найти ваше доменное имя на вашем компьютере.
Домены против рабочих групп
Прежде чем мы обсудим больше о доменах, мы должны кратко упомянуть, как они сравниваются с рабочими группами. Если компьютер не входит в домен, он входит в рабочую группу. Они гораздо более слабые, чем домены, поскольку у них нет центральной власти. У каждого компьютера свои правила.
В современных версиях Windows рабочие группы — это просто формальность, особенно когда Microsoft отказывается от функции HomeGroup . Windows никогда не просит вас настроить один, и они используются только для обмена файлами между устройствами в вашей сети . В настоящее время Microsoft хочет, чтобы вы использовали для этого OneDrive, поэтому, если вы не хотите настраивать свою рабочую группу, вам не нужно об этом беспокоиться.

Что такое учетная запись пользователя домена?
В отличие от персонального компьютера, компьютер, подключенный к домену, не использует локальные учетные записи для входа в систему. Вместо этого контроллер домена управляет логинами. Используя Microsoft Active Directory, программное обеспечение для управления пользователями, сетевые администраторы могут легко создавать новых пользователей и отключать старых. Они также могут добавлять пользователей в определенные группы, чтобы разрешить доступ к частным папкам сервера.
С помощью доменной учетной записи вы можете войти на любой компьютер в домене. Вы начнете с новой учетной записи на этом ПК, но это позволит вам использовать любой компьютер в вашей компании при необходимости. Благодаря доменным учетным записям бывшие сотрудники не могут войти в систему. Если они попытаются войти со своим старым паролем, они увидят сообщение, что им отказано в доступе.
Экран входа в Windows выглядит немного иначе, когда вы используете компьютер, подключенный к домену. Вместо локального имени пользователя вам необходимо убедиться, что вы входите в домен под своим именем пользователя. Таким образом, ваш логин будет выглядеть примерно так: MyDomain StegnerB01 .
Контроль домена и групповая политика в Windows
Самым большим преимуществом доменов является простота управления несколькими компьютерами одновременно. Без домена ИТ-персоналу пришлось бы индивидуально управлять каждым компьютером в компании. Это означает настройку параметров безопасности, установку программного обеспечения и управление учетными записями пользователей вручную. Хотя это может сработать для крошечной компании, это не масштабируемый подход и быстро станет неуправляемым.
Наряду с управлением пользователями Active Directory присоединение компьютеров к домену позволяет использовать групповую политику. Мы обсудили, как групповая политика полезна на вашем компьютере. которыми групповая политика которыми групповая политика , но он действительно предназначен для корпоративного использования.
Используя контроллер домена, администраторы могут настраивать все виды безопасности и использовать политики для всех компьютеров. Например, групповая политика упрощает применение всех следующих методов:
- Удаление элементов из меню «Пуск»
- Остановка пользователей от изменения параметров подключения к интернету
- Блокировка командной строки
- Перенаправьте определенную папку, чтобы использовать ее на сервере
- Запретить пользователю изменять звуки
- Подключите принтер к новым компьютерам автоматически
Это лишь небольшая выборка того, что позволяет групповая политика. Администраторы могут настроить эти изменения один раз и применить их ко всем компьютерам, даже к новым, которые они настроят позже.
Присоединиться или оставить домен в Windows
Как правило, добавление компьютера в домен или удаление его не будет вашей работой. ИТ-персонал вашей компании позаботится о присоединении до того, как вы получите компьютер, и заберет ваш компьютер, когда вы уйдете. Для завершения, однако, мы упомянем, как этот процесс работает здесь.
Вернитесь в Панель управления> Система снова. На странице имени компьютера, домена и настроек рабочей группы нажмите Изменить настройки . Вы увидите окно « Свойства системы» . Нажмите кнопку « Изменить» рядом с полем « Переименовать этот компьютер» или «Изменить доменное имя» .
Здесь вы увидите окно, позволяющее изменить имя вашего компьютера ( это не единственное место, где это можно сделать в Windows 10 ). Что еще более важно, вы увидите член коробки ниже. Проверьте домен пузыря и введите имя домена, чтобы присоединиться к нему. Windows подтвердит это, поэтому вам нужно иметь домен для присоединения.

После перезагрузки ПК ваш компьютер будет находиться в домене. Чтобы покинуть домен, повторите этот процесс, но вместо этого выберите пузырь рабочей группы . Конечно, для этого вам понадобится пароль администратора домена.