Является ли AppDomain эквивалентом кода процесса для .NET?
Мне нужно называть некоторые плохо написанные сторонние COM-компоненты, которые имеют утечки памяти и используют Single Threaded Apartment [STA] в течение долгого процесса.
Я знаю, что отдельный процесс будет хорошим способом его реализации, и я могу перезапустить его из-за продолжительного процесса.
Может ли AppDomain использоваться вместо этого? Является ли AppDomain потоком STA, если он соответствующим образом указан? У него есть собственная память для COM-объектов? Разгрузка AppDomain эквивалентна уничтожению процесса?
Ответы
Ответ 1
AppDomain не обеспечивает ту же степень изоляции, что и процесс. На самом деле, если вы обеспокоены тем, что сторонний компонент не в хорошей форме, существует риск, что он потянет ваше приложение .NET.
AppDomain не может быть выгружен, если неуправляемый код выполняется во время разгрузки, поэтому вам может быть сложно контролировать ваш сторонний код в AppDomain. См. http://msdn.microsoft.com/en-us/library/system.appdomain.unload.aspx
Даже для управляемого кода, AppDomain не обеспечивает надежное решение для изолированных программ. Например. если загруженный код порождает любые потоки, это приведет к уничтожению всего процесса в случае необработанных исключений. У этого вопроса есть немного больше информации: .NET. Каков наилучший способ реализовать "ухватить все обработчики исключений" ?.
Насколько мне известно, лучшим вариантом для размещения кода, подобного этому в приложении .NET, является реализация собственного процесса хоста CLR, такого как IIS и SQL Server.
Ответ 2
An AppDomain (область приложения) - изолированная среда, в которой выполняются приложения.
Они помогают обеспечить изоляцию, разгрузки и границ безопасности для выполнение управляемого кода.
-
Используйте домены приложений для изоляции задач, которые могут привести к сбою процесса. Если состояние AppDomain это выполнение задачи становится нестабильным, AppDomain можно разгружать без влияя на процесс. Это важно, когда процесс должен выполняться для длительные периоды без перезапуска. Вы также может использовать домены приложений для изолировать задачи, которые не должны данных.
-
Если сборка загружена в домен приложения по умолчанию, она не может выгружаться из памяти, в то время как процесс выполняется. Однако, если вы откройте второй домен приложения загрузить и выполнить сборку, сборка выгружается, когда область приложения выгружается. использование этот метод минимизации рабочих набор длительных процессов, которые иногда используют большие библиотеки DLL.
Несколько доменов приложений могут выполняться в одном процессе; однако существует не взаимно однозначная корреляция между доменов приложений и потоков. Несколько потоков могут принадлежать одному домена приложения, и в то время как данный нить не ограничивается одним домена приложения в любой момент времени, поток выполняется в одном домена приложения.
SO Вопросы, которые могут представлять интерес:
Я не буду признавать себя экспертом в области AppDomains, но я уверен, что утечка памяти COM-объекта (т.е. неуправляемая память) не будет освобождена путем разгрузки AppDomain. Возможно, кто-то, более знакомый с этим, мог бы прокомментировать.
Как отметил Брайан, "... в домене .NET Framework версии 2.0 не гарантируется выгрузка, потому что может быть невозможно завершить выполнение потоков".