2010-02-05 3 views
15

Насколько я понимаю, что такое AppDomain, однако я не полностью понимаю использование AppDomain.Для каких доменов приложений используется?

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

В частности:

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

Я бы предложил расщепить этот quetion, по крайней мере, на 2 - один об исключениях, связанных с inter-AppDomain. – Mikeon

ответ

13

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

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

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

+0

Я должен уточнить - я имел в виду только свой собственный * собственный код! –

1

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

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

4

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

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

  • вы можете выгрузить AppDomain; Я использую это для системы, которая компилирует себя (метапрограммирование) на основе данных из базы данных - она ​​может развернуть appdomain для размещения новой dll на некоторое время, а затем безопасно поменять ее, когда новые данные будут доступны (и построены)
  • Отношения между AppDomain s относительно дешевы. IMO это единственный раз, когда я счастлив использовать удаленный доступ (хотя вы все равно должны быть действительно осторожно об объектах на границе, чтобы избежать кровоточащих ссылок между ними, вызывая «слияние» для загрузки дополнительных DLL в первичные AppDomain , что вызывает утечку) - это тоже очень просто - только CreateInstanceAndUnwrap (или это CreateInstanceFromAndUnwrap?).
  • против устранения дополнительного процесса - вы можете пойти в любом случае; но вам не нужен еще один ех для AppDomain работы, и это гораздо легче настроить любой Comms, что вам нужен
6

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

В ответ на ваши очки/вопрос:

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

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

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

0
стратегия сегрегации

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

+1

вы знаете, microsoft удалил AppDomains в ядре ASP.NET ... – docesam

+0

Нет, я этого не сделал, но теперь я делаю – LastTribunal

Смежные вопросы