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

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

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

в частности:

  • Я понимаю, что ошибка или фатальное исключение в одном домене не влияет на другие домены приложений, работающие в том же процессе - это также верно для неуправляемый / c++ исключения, возможно даже повреждение кучи или другие проблемы с памятью.
  • как работает связь между AppDomain?
  • как использование AppDomains отличается от простого нереста многих процессов?

5 ответов


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

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

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


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

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

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

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

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


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

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

  • вы можете выгрузить AppDomain; Я использую это для системы, которая компилирует себя (мета-программирование) на основе данных из база данных-он может вращать appdomain для размещения новой dll на некоторое время, а затем безопасно поменять его, когда новые данные доступны (и построены)
  • связь между AppDomains относительно дешевы. IMO это единственный раз, когда я С использовать remoting (хотя вам все равно нужно быть действительно осторожно об объектах на границе, чтобы избежать кровотечения ссылок между ними, в результате чего "слияние" загружает дополнительные библиотеки DLL в основной AppDomain, вызывая утечку) - it действительно легко тоже-просто CreateInstanceAndUnwrap (или CreateInstanceFromAndUnwrap?).
  • vs порождение дополнительного процесса-вы можете пойти в любом случае; но вам не нужен другой exe для AppDomain работа, и гораздо проще настроить любую связь, которая вам нужна

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

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


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