Для чего используются домены приложения?

Я понимаю примерно, каков AppDomain, однако я не полностью понимаю использование для AppDomain.

Я вовлечен в большой сервер базирующийся C# / приложение C++, и я задаюсь вопросом, как использование AppDomains могло улучшить устойчивость / безопасность / производительность.

В особенности:

  • Я понимаю, что отказ или критическое исключение в одном домене не влияют на другие домены приложения, работающие в том же процессе - Делает это также сохраняется для неуправляемого / исключения C++, возможно даже повреждение "кучи" или другие проблемы памяти.
  • Как коммуникация inter-AppDomain работает?
  • Как использование AppDomains отличается от простого порождения многих процессов?
15
задан Justin 5 February 2010 в 12:13
поделиться

4 ответа

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

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

Между прочим, машинный код, повреждающий кучу, не может быть защищен ни одной функцией CLR. В конечном итоге среда CLR реализована изначально и использует одно и то же адресное пространство. Таким образом, машинный код в процессе может нацарапать всю внутреннюю часть CLR! Единственный способ изолировать плохо работающий (т.е. большую часть) нативный код - это фактическая изоляция процесса на уровне ОС. Запустите несколько процессов .exe и попросите их обмениваться данными через какой-то механизм IPC.

14
ответ дан 1 December 2019 в 02:55
поделиться

Я настоятельно рекомендую CLR Via C # Джеффри Рихтера. В частности, в главе 21 подробно рассказывается о назначении и использовании доменов приложений.

Отвечая на ваши вопросы / вопросы:

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

  • Обмен данными между доменами приложений осуществляется с помощью удаленного взаимодействия .NET для обеспечения изоляции. Это может быть маршалинг по ссылке или маршалинг по семантике значения с компромиссом между производительностью и гибкостью.

  • Домены приложений - это легкий способ достижения изоляции в рамках управляемого кода. Домены приложений считаются легковесными, потому что вы можете создать несколько доменов приложений в рамках одного процесса, что позволяет избежать накладных расходов на ресурсы и производительность нескольких процессов ОС. Кроме того, один поток может выполнять код в одном домене приложения, а затем в другом домене приложения, поскольку Windows ничего не знает о доменах приложений (см. Это с помощью System.AppDomain.CurrentDomain)

6
ответ дан 1 December 2019 в 02:55
поделиться

На самом деле неверно , что критический сбой в одном домене приложений не может повлиять на другие. В случае плохих вещей лучше всего сорвать процесс. Есть несколько примеров, но, честно говоря, я их не запомнил - я просто сделал мысленную заметку «плохие вещи = процесс демонтажа (проверка)»

Преимущества AppDomain :

  • вы можете выгрузить AppDomain ; Я использую это для системы, которая компилируется (метапрограммирование) на основе данных из базы данных - она ​​может на некоторое время развернуть домен приложения для размещения новой библиотеки DLL, а затем безопасно заменить ее, когда новые данные доступны (и созданы)
  • обмен данными между доменами приложений относительно дешев. IMO, это единственный раз, когда я счастлив использовать удаленное взаимодействие (хотя вам все равно нужно действительно быть осторожными с объектами на границе, чтобы избежать утечки ссылок между ними, вызывая «слияние» для загрузки дополнительных dll в основной AppDomain , вызывая утечку) - это тоже очень просто - просто CreateInstanceAndUnwrap (или это CreateInstanceFromAndUnwrap ?).
  • против создания дополнительного процесса - вы можете пойти любым путем; но вам не нужен другой исполняемый файл для работы AppDomain , и гораздо проще настроить любую необходимую связь
4
ответ дан 1 December 2019 в 02:55
поделиться

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

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

1
ответ дан 1 December 2019 в 02:55
поделиться
Другие вопросы по тегам:

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