Що таке домен програми .NET?


83

Зокрема, які наслідки має запущений код у двох різних доменах додатків?

Як зазвичай передаються дані через межу домену програми? Це те саме, що передача даних через межу процесу? Мені цікаво дізнатись більше про цю абстракцію та для чого вона корисна.

РЕДАГУВАТИ: Загалом хороший рівень охоплення класу AppDomain, оскільки я не розумію додаткові домени


3
Перша частина є копією stackoverflow.com/questions/622516/i-dont-understand-appdomains . Можливо, питання слід відредагувати, щоб стосуватися передачі даних.
Джон Сондерс,

Вупс, пропустив той. Це можна закрити.
Лука

Відповіді:


78

AppDomain в основному забезпечує ізольовану область , в якій код працює всередині процесу.

Простий спосіб подумати про це майже як легший процес, який сидить усередині основного процесу. Кожен AppDomain існує в процесі в повній ізоляції, що дозволяє безпечно запускати код (його можна вивантажити, не руйнуючи весь процес, якщо потрібно), з окремим захистом тощо.

Що стосується вашої специфіки - якщо ви запускаєте код у двох різних AppDomains в процесі, код буде працювати ізольовано. Будь-який зв’язок між AppDomains буде або серіалізований, або оброблений через MarshallByRefObject. Він поводиться дуже схоже на використання дистанційного керування в цьому відношенні. Це забезпечує величезний рівень безпеки - ви можете запустити код, якому не довіряєте, і якщо це зробить щось не так, це не вплине на вас.

У описі доменів програм MSDN є набагато більше деталей .


Чи можете ви пояснити, що ви маєте на увазі під "якщо це робить щось не так"?
Лука

11
Один із прикладів: якщо у вас є оброблений потік у пулі потоків, він зруйнує домен програми. Зазвичай це вбиває ваш процес - що небезпечно, якщо ви завантажуєте код користувача або плагін. Запуск в окремому додатковому домені означає, що ви можете впоратися з цим набагато краще - якщо другий AppDomain потрібно зруйнувати, ви можете впоратися з цим, не зриваючи ваш процес.
Рід Копсі,

20

Це ізолюючий рівень, наданий середовищем виконання .NET. Таким чином, домени додатків живуть у процесі (1 процес може мати багато доменів додатків) і мають власний віртуальний адресний простір.

Домени додатків корисні, оскільки:

  • Вони дешевші за повні процеси
  • Вони багатопоточні
  • Ви можете зупинити один, не вбиваючи все в процесі
  • Розділення ресурсів / config / тощо
  • Кожен домен програми працює на власному рівні безпеки

1

Якщо поглянути на це з точки зору внутрішніх деталей процесора, він встановлює різне значення для реєстру сегмента коду (CS). код і регістр CS: IP (вказівник інструкції) - це той, який виконується процесором.

(Я вибрав обговорення обговорених таблиць сторінок для стислості).

AppDomain позначає цю межу. для безпеки коду.

Причиною цього висновку є уникнення запитань такого роду: 1. як ми можемо отримати доступ до ресурсу через два домени додатків (так, використовуючи конвеєри або інші механізми спільного використання, а не безпосередньо, оскільки CS: IP не може бути встановлений для іншого домену додатків. Це може зробити лише ОС. Не CLR)

  1. Чи може бути кілька потоків у домені програми. Технічно так, оскільки значення CS буде в поточному процесі. ви можете змінити IP на щось інше за допомогою оператора переходу (комбінація виклику функції / переходу)

  2. може два потоки в двох різних доменах додатків спілкуватися (№, див. пункт 1.)

  3. може спілкуватися два потоки в одному домені програми (так. див. пункт 2)

На кілька інших поєднань цих випадків можна дати відповідь, мало знаючи про те, як працює CS: IP.


0

Кожна програма, що працює в процесі, AppDomain - це також легкий процес, або, можна сказати, логічна одиниця, яка має групу збірок (це контейнер, що містить групу збірок), і вона існує всередині процесу на рівні ізоляції того самого процесу , це дозволяє запускати декілька збірок в рамках одного процесу і запобігати їх прямому доступу.

Запуск Dot Net Application у AppDomain: Після запуску будь-якої точкової мережевої програми оболонка операційної системи завантажує CLR у процес, і новий AppDomain створюється в тому ж процесі та завантажує всі збірки в створений AppDomain, тепер із коду AppDomain буде виконано.

Коли користувацький AppDomain: ми можемо створити власний AppDomain, тепер справа в тому, за яким сценарієм ми можемо створити власний AppDomain. Припустимо, час роботи нам потрібно додати або видалити збірки без перерви запущеного додатка, тоді ми можемо створити власний AppDomain.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.