Домен приложения — это механизм (похожий на процесс в операционной системе ), используемый в Common Language Infrastructure (CLI) для изоляции исполняемых программных приложений друг от друга, чтобы они не влияли друг на друга. Каждый домен приложения имеет свое собственное виртуальное адресное пространство , которое ограничивает ресурсы для домена приложения, используя это адресное пространство .
Создание нескольких доменов приложений в одном процессе невозможно в .NET Core и .NET 5+. [1]
Домен приложения CLI содержится в процессе операционной системы. Процесс может содержать множество доменов приложений. Домены приложений имеют свойства изоляции, аналогичные свойствам процессов операционной системы:
В этом смысле CLI похож на мини-операционную систему. Он запускает один процесс, содержащий ряд подпроцессов или доменов приложений.
Преимущество доменов приложений заключается в том, что запуск нескольких доменов приложений может потребовать меньше ресурсов, таких как память, чем запуск нескольких процессов операционной системы. Связь между доменами по-прежнему требует маршалинга, поэтому накладные расходы могут быть ближе к использованию нескольких процессов, чем к связи в пределах одного домена.
Непосредственная связь не может быть достигнута между доменами приложений. Однако домены приложений все еще могут общаться друг с другом, передавая объекты через маршалинг по значению (непривязанные объекты), маршалинг по ссылке через прокси (объекты, привязанные к домену приложения). Существует третий тип объекта, называемый контекстно-привязанным объектом, который может быть маршалинг по ссылке между доменами, а также в контексте своего собственного домена приложения. Благодаря проверяемой безопасности типов управляемого кода CLI может обеспечить изоляцию сбоев между доменами с гораздо меньшими затратами, чем процесс операционной системы. Статическая проверка типов, используемая для изоляции, не требует тех же переключений процессов или аппаратных кольцевых переходов, которые требуются процессу операционной системы.
Домены приложений — это концепция чисто управляемого кода . Любой включенный собственный /неуправляемый код (например, C++) в значительной степени не знает о них. Статические переменные, похоже, являются общими для всех доменов, обратные вызовы могут быть проблематичными, а любые ошибки повреждения памяти в одном домене, скорее всего, повредят другие домены.