AppDomain эквивалентен процессу для кода .NET? - PullRequest
13 голосов
/ 10 августа 2009

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

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

Можно ли использовать вместо этого AppDomain? Поток AppDomain - это поток STA, если он помечен соответствующим образом? Есть ли у него собственная память для COM-объектов? Является ли выгрузка AppDomain равносильно уничтожению процесса?

Ответы [ 2 ]

23 голосов
/ 10 августа 2009

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

AppDomain не может быть выгружен, если во время выгрузки выполняется неуправляемый код, поэтому вам может быть трудно контролировать свой сторонний код в AppDomain. Смотри http://msdn.microsoft.com/en-us/library/system.appdomain.unload.aspx

Даже для управляемого кода AppDomain не предоставляет надежного решения для песочницы. Например. если загруженный код порождает какие-либо потоки, это приведет к завершению всего процесса в случае необработанных исключений. В этом вопросе есть немного больше информации: .NET - Какой лучший способ реализовать «обработчик всех исключений» .

Насколько мне известно, лучший вариант для размещения такого кода в приложении .NET - это реализовать собственный процесс хоста CLR, как это делают IIS и SQL Server.

0 голосов
/ 10 августа 2009

An AppDomain (домен приложения) - это изолированная среда, в которой выполняются приложения.

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

  • Используйте домены приложений для изоляции задач, которые могут остановить процесс. Если состояние AppDomain это выполнение задачи становится нестабильным, AppDomain может быть выгружен без влияет на процесс. Это важно, когда процесс должен выполняться для длительные периоды без перезапуска. Вы также можно использовать домены приложений для изолировать задачи, которые не должны делиться данные.

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

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

ТАК Вопросы, которые могут быть интересны:

Я не буду заявлять, что являюсь экспертом в области доменов приложений, но я совершенно уверен, что утечка памяти в COM-объекте (т.е. неуправляемая память) не будет освобождена при выгрузке домена приложений. Возможно, кто-то более знакомый с этим мог бы прокомментировать.

Как указал Брайан, «... в домене .NET Framework версии 2.0 выгрузка не гарантируется, поскольку может быть невозможно прервать выполнение потоков.»

...