Вопрос по c#, .net, appdomain – Что такое AppDomain? [Дубликат]

127

На этот вопрос уже есть ответ:

Использование AppDomain в C # 5 ответов

Что такое AppDomain? Каковы преимущества AppDomains или почему Microsoft привела концепцию AppDomains, в чем была проблема без AppDomains?

Пожалуйста, дополните

Кроме того, класс ApplicationManager расположен поверх ВСЕХ работающих доменов приложений. contactmatt
Stackoverflow.com / вопросы / 665668 / использование-оф-AppDomain-в-с Интересно, что ответили те же парни! Mehrdad Afshari
Stackoverflow.com / а / 41410172/993672 ответил здесь Shivprasad Koirala
Пожалуйста, прочитайте мой блог для стандартного применения кросс-коммуникации с помощью AppDomain. Blog.vcillusion.co.in / ... vCillusion

Ваш Ответ

3   ответа
114

АнAppDomain обеспечивает уровень изоляции внутри процесса. Все, что вы обычно рассматриваете как «по программе» (статические переменные и т. Д.), Фактически относится к домену приложений. Это полезно для:

plugins (вы можете разгрузитьAppDomain, но не сборка anAppDomain)security (вы можете запустить набор кода с определенными уровнями доверия)isolation (вы можете запускать разные версии сборок и т. д.)

Боль в том, что тебе нужно использовать удаленное взаимодействие и т. Д.

См. MSDN для более подробной информации. Честно говоря, это не то, с чем вам нужно часто связываться.

Одна маленькая (но важная) вещь, которую стоит упомянуть: домены приложений не охватывают темы. mmmmmmmm
Как заметил @Marc, хорошая идея - думать о AppDomain как о дополнительном слое изоляции. Я хотел бы поместить это в контекст: [Процесс> CLR> AppDomain> Сборка со статикой> Поток со стеком]. Это означает, что процесс содержит общеязыковую среду выполнения (CLR). CLR имеет один или несколько доменов приложений. Каждый AppDomain загружает одну или несколько сборок. Каждая сборка имеет свои собственные статические переменные и один или несколько потоков. Каждый поток имеет свой собственный стек. Doomjunky
@ AgentFire: если какой-то код, запущенный в каком-то потоке, а какой-то домен приложений, вызывает код из другого домена приложений, то этот поток «пересекает» границу домена приложений и запускает код из этого другого домена приложений. Таким образом, потоки не принадлежат конкретным доменам приложений ... хотя можно сказать, что поток «принадлежит» домену, из которого создавался код. Но поток может запускать код из любого домена приложений. mmmmmmmm
@ RüdigerStevens - это действительно преимущество. AgentFire
@ RüdigerStevens что ты имеешь в виду ?? AgentFire
45

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

Separate AppDomains не разделяют пространство памяти, и, следовательно, один AppDomain не может напрямую ссылаться на содержимое в другом. В частности, данные должны передаваться между доменами приложений посредством процесса копирования по значению. В частности, ссылочные объекты, которые опираются на указатели и, следовательно, адреса памяти, должны быть сначала сериализованы из источника, а затем десериализованы в целевой домен приложений.

Ранее в системах Windows границы памяти реализовывались процессами; Тем не менее, создание процессов является ресурсоемким. Они также служат двойной цели в качестве границ потоков. Домены приложений, с другой стороны, имеют дело только с границей памяти или адресным пространством. Потоки могут «перетекать» через домены приложений (то есть процедура может вызывать точку входа в другом домене приложений и ожидать его возврата. Говорят, что поток «продолжает» выполнение в другом домене приложений).

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

Примечание 1: смысл потока, пересекающего AppDomain, заключается в блокирующем или синхронном вызове метода в другом AppDomain (в отличие от неблокирующего или асинхронного вызова, который порождает другой поток для продолжения выполнения в целевом AppDomain и продолжения его текущего AppDomain без ответа).

Примечание 2: существует такая вещь, как Thread Local Storage. Тем не менее, лучшим именем было бы локальное хранилище потоков домена приложений, поскольку потоки оставляют свои данные при пересечении доменов приложений, но возвращают их обратно при возвращениhttp: //msdn.microsoft.com/en-us/library/6sby1byh.asp

Примечание 3: .Net Runtime - это приложение Windows Process со связанной кучей. В этой куче может размещаться один или несколько доменов приложений. Тем не менее, домены приложений предназначены для того, чтобы не обращать внимания друг на друга и общаться друг с другом посредством маршалинга. Возможно, что можно выполнить оптимизацию, которая обойдет маршалинг между взаимодействующими доменами приложений, использующими одну и ту же среду выполнения .Net и, следовательно, одну и ту же кучу процессов Windows.

Когда домены приложений являются частью одного и того же процесса Windows (и, следовательно, в одном и том же экземпляре среды выполнения .Net), они обязательно будут в той же управляемой куче указанного процесса Windows; однако это обстоятельство обычно невидимо для приложения .Net. Помните, что приложение .Net не является приложением Windows Process и фактически работает на виртуальной машине. George
Ну, я была немного смущена твоим высказыванием Отдельные домены приложений не разделяют пространство памяти и @ Брайан РасмуссенAppDomains являются частью одного и того же процесса и, таким образом, фактически используют одну и ту же управляемую куч. Можешь немного уточнить? cat_minhv0
32

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

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

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

Просто одна заметка. Строковые строки, кажется, не являются общими для разных доменов приложени Diligent Key Presser

Похожие вопросы