Домены приложений C#

Приветствую всех, сегодня тема про домены приложений, посмотрим для чего они нужный и как их использовать. В основу доменов лежала безопасность расширяемых приложений. Сейчас это можно сравнить с плагинами, которые может писать любой программист, для основного приложения. Однако доверенные лица основного приложения компании, предоставляют сертификаты, которые позволяют их плагинам иметь безграничные возможности и тем самым несут ответственность перед компанией основного приложения. И на против минимальные возможности имеют не сертифицированы программисты, и да же если их код будет иметь вредоносный смысл, такой плагин ничего не сможет сделать.

Процессом в операционной системе называют выполняющуюся программу и все её элементы: адресное пространство, глобальные переменные, регистры, стек, открытые файлы и т. д. Процессу предоставляется собственное виртуальное адресное пространство размером 4 GB для 32-разрядных систем и 16 GB для 64-разрядных систем. Процессам часто нужно взаимодействовать друг с другом, например, один процесс может передавать данные другому процессу, или несколько процессов могут обрабатывать данные из общего файла. Для организации взаимодействия между процессами используются различные механизмы IPC (InterProcess Communication ).

IPC (InterProcess Communication — межпроцессное взаимодействие). Механизмы, предназначенные для организации взаимодействия между процессами.

Домен приложения – логический контейнер, позволяющий выполнять внутри одного процесса несколько сборок, не предоставляя им прямого доступа к памяти внутри других сборок. Домены поддерживают многие из функций, стандартных для процессов, включая разграничение областей памяти и доступа к ресурсам. Однако домены приложений эффективнее процессов, поскольку в одном домене приложений могут работать несколько сборок, но без издержек на запуск отдельных процессов.

Ключевое различие между доменом и процессом: Доменами приложения управляет исполняющая среда .NET Framework, а процессами – операционная система.

Обычно домены приложений для сборок автоматически создает хост исполняющей среды. Примерами хостов в таком случае могут быть, например, ASP .NET, Internet Explorer, сама операционная система.

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

Сборки изолируют не только в целях защиты, но и для повышения надежности и производительности:

  • Повышение надежности – Используя домены приложений для изоляции задач,которые могут вызвать аварийное завершение процесса. Если домен приложения становится нестабильным, его можно выгрузить, не затрагивая процесс в целом. Это особенно важно, когда процесс должен длительное время работать без перезапуска.
  • Повышение производительности – Если сборка загружена в домен приложения по умолчанию, ее нельзя выгрузить из памяти, пока выполняется процесс. Но если открыть второй домен приложения, загрузить в нем сборку, эта сборка может быть выгружена вместе с доменом приложения. Эта методика позволяет сократить рабочий набор процессов, работающих длительное время и использующих громоздкие динамически подключаемые библиотеки (DLL).

 

В .NET Framework домены приложений реализуют при помощи класса System.AppDomain. Для создания домена приложения вызывается один из перегруженных методов  AppDomain.CreateDomain. Получить домен, в котором выполняет сборка в текущий момент можно, обратившись к свойству AppDomain.CurrentDomain.

Класс AppDomain , представляет домен приложения, являющийся изолированной средой, в которой выполняются приложения. Этот класс не наследуется. Класс AppDomain реализует набор событий, позволяющих приложениям реагировать на загрузку сборки, выгрузку домена приложения или выброс необработанного исключения.

Класс AppDomain , наследуется от MarshalByRefObject , и реализует интерфейсы _AppDomain и IEvidenceFactor.

Класс ObjectHandle используется для передачи объекта (в свернутом состоянии) между множественными доменами приложения без загрузки метаданных для свернутого объекта в каждом домене приложения AppDomain , через который переносится обработчик ObjectHandle . Таким образом, класс ObjectHandle предоставляет вызывающему контроль над моментом загрузки Type удаленного объекта в домен.

Для выполнения сборки в отдельном домене, необходимо получить доступ к нужному домену (или создать его) и вызвать метод ExecuteAssembly.

Вместо указания полного пути к сборке, можно добавить ссылку на нее и вызывать сборку по имени методом ExecuteAssemblyByName. Такой способ вызова изолирует сборку, но не позволяет в полной мере воспользоваться преимуществами доменов приложений.

Одним из преимуществ загрузки сборок в новые домены приложений является возможность в любой момент освободить ресурсы, выгрузив домен приложения. Чтобы выгрузить домен приложения со всеми его сборками, достаточно вызвать статический метод AppDomain.Unload.

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

Чтобы назначить сборке удостоверения, следует создать объект System.Security.Policy.Evidence, а затем передать его как параметр перегруженному методу ExecuteAssembly. Проще всего управлять разрешениями, назначенными сборке в домене приложения, передав удостоверения зоны безопасности при помощи объекта System.Security.Policy.Zone и перечислимого System.Security.SecurityZone.

Если в одном из доменов происходит критическая ошибка или прорыв в системе защиты, то это никак не скажется на остальных доменах.

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

Преимущество доменов:

  • Экономия памяти
    – При запуске экземпляров приложения в одном процессе, разделении ресурсов, расход памяти может снизится в разы
  • Обмен данными между доменами быстрее чем между процессами
    – Разница в времени доступа – десятки раз.
    – Тем не менее, скорость взаимодействия между доменами значительно ниже вызовов внутри домена (сотни раз), объем данных, передающихся через границу домена, надо стараться сделать как можно меньше
  • Изоляция доменов приложений более эффективна за счет верификации управляемого кода

 

  • .NET Remoting позволяет передавать объекты между приложениями следующими способами.
    – Как параметры методов.
    Пример: public int myRemoteMethod (MyRemoteObject myObj)
    – Как возвращаемые значения методов.
    Пример: public MyRemoteObject myRemoteMethod(String myString)
    – Как свойства или поля .NET-компонентов.
    Пример: myObj.myNestedObject
  • При передаче объектов с маршалингом по значению (Marshal By Value, MBV) из одного приложения в другое создается полная копия объекта.
  • При передаче объектов с маршалингом по ссылке (Marshal By Reference, MBR) из одного приложения в другое создается ссылка на объект. Когда удаленное приложение получает ссылку на объект (ObjRef), она преобразуется в «прокси», обеспечивающий доступ к исходному объекту.

Взаимодействие объектов в разных доменах приложений происходит либо путем передачи копий объектов через границы доменов приложений, либо путем обмена сообщениями при помощи прокси-сервера. MarshalByRefObject является базовым классом объектов, взаимодействующих через границы доменов приложения путем обмена сообщениями при помощи прокси-сервера. В пределах локального домена приложения доступ к объектам MarshalByRefObject предоставляется непосредственно. При первом доступе приложения в удаленном домене к объекту MarshalByRefObject в удаленное приложение передается прокси-сервер. Последующие вызовы прокси-сервера снова маршалируются в объект, находящийся в локальном домене приложения.

 

Пример того как можно запустить исполняемый фаил по указанному пути используя домен:

Получаем всю информацию о домене:

 

 

 

 

 

Обновлено: 15.07.2018 — 16:25

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.