Я понимаю примерно, каков AppDomain, однако я не полностью понимаю использование для AppDomain.
Я вовлечен в большой сервер базирующийся C# / приложение C++, и я задаюсь вопросом, как использование AppDomains могло улучшить устойчивость / безопасность / производительность.
В особенности:
Основной вариант использования AppDomain находится в среде, в которой размещен сторонний код, поэтому потребуется не только динамически загружать сборки , но и выгружать их .
Невозможно выгрузить сборку по отдельности. Поэтому вам нужно создать отдельный AppDomain для размещения всего, что может потребоваться выгрузить. Затем вы можете удалить и перестроить весь AppDomain, когда это необходимо.
Между прочим, машинный код, повреждающий кучу, не может быть защищен ни одной функцией CLR. В конечном итоге среда CLR реализована изначально и использует одно и то же адресное пространство. Таким образом, машинный код в процессе может нацарапать всю внутреннюю часть CLR! Единственный способ изолировать плохо работающий (т.е. большую часть) нативный код - это фактическая изоляция процесса на уровне ОС. Запустите несколько процессов .exe и попросите их обмениваться данными через какой-то механизм IPC.
Я настоятельно рекомендую CLR Via C # Джеффри Рихтера. В частности, в главе 21 подробно рассказывается о назначении и использовании доменов приложений.
Отвечая на ваши вопросы / вопросы:
Домены приложений не защитят ваше приложение от мошеннического неуправляемого кода. Если это проблема, вам, скорее всего, потребуется использовать полную изоляцию процессов, предоставляемую ОС.
Обмен данными между доменами приложений осуществляется с помощью удаленного взаимодействия .NET для обеспечения изоляции. Это может быть маршалинг по ссылке или маршалинг по семантике значения с компромиссом между производительностью и гибкостью.
Домены приложений - это легкий способ достижения изоляции в рамках управляемого кода. Домены приложений считаются легковесными, потому что вы можете создать несколько доменов приложений в рамках одного процесса, что позволяет избежать накладных расходов на ресурсы и производительность нескольких процессов ОС. Кроме того, один поток может выполнять код в одном домене приложения, а затем в другом домене приложения, поскольку Windows ничего не знает о доменах приложений (см. Это с помощью System.AppDomain.CurrentDomain)
На самом деле неверно , что критический сбой в одном домене приложений
не может повлиять на другие. В случае плохих вещей лучше всего сорвать процесс. Есть несколько примеров, но, честно говоря, я их не запомнил - я просто сделал мысленную заметку «плохие вещи = процесс демонтажа (проверка)»
Преимущества AppDomain
:
AppDomain
; Я использую это для системы, которая компилируется (метапрограммирование) на основе данных из базы данных - она может на некоторое время развернуть домен приложения для размещения новой библиотеки DLL, а затем безопасно заменить ее, когда новые данные доступны (и созданы) доменами приложений
относительно дешев. IMO, это единственный раз, когда я счастлив использовать удаленное взаимодействие (хотя вам все равно нужно действительно быть осторожными с объектами на границе, чтобы избежать утечки ссылок между ними, вызывая «слияние» для загрузки дополнительных dll в основной AppDomain
, вызывая утечку) - это тоже очень просто - просто CreateInstanceAndUnwrap
(или это CreateInstanceFromAndUnwrap
?). AppDomain
, и гораздо проще настроить любую необходимую связь Я не претендую на звание эксперта по доменам приложений, поэтому мой ответ не будет всеобъемлющим. Возможно, мне стоит начать со ссылки на отличное введение парня, который в некотором роде производит впечатление эксперта, и что действительно похоже на , охватывающее все аспекты использования AppDomain .
Моя основная встреча с доменами приложений была связана с безопасностью. Здесь самым большим преимуществом, которое я обнаружил, была возможность запускать главный домен с высоким уровнем доверия, порождая несколько дочерних доменов с ограниченными разрешениями. Ограничивая разрешения с высоким уровнем доверия, без использования доменов приложений, ограниченные процессы все равно будут иметь разрешение на повышение своих собственных привилегий.