2009-08-10 13 views
13

Tengo que llamar a algunos componentes COM de terceros mal escritos que tienen pérdidas de memoria y utiliza Single Threaded Apartment [STA] dentro de un proceso de larga ejecución.¿AppDomain es equivalente a un proceso para el código .NET?

Sé que el proceso por separado será una buena manera de implementarlo y puedo reiniciarlo ocasionalmente desde el largo proceso.

¿Se puede usar AppDomain en su lugar? ¿AppDomain enhebra un hilo STA si está marcado apropiadamente? ¿Tiene su propia memoria para objetos COM? ¿La descarga de AppDomain es equivalente a matar el proceso?

Respuesta

22

Un dominio de aplicación no proporciona la misma grado de aislamiento como un proceso lo hace. De hecho, si le preocupa que el componente de terceros no esté en buen estado, existe el riesgo de que anule su aplicación .NET.

Un AppDomain no se puede descargar si el código no administrado se está ejecutando en el momento de la descarga, por lo que puede tener dificultades para controlar su código de terceros en un dominio de aplicación. Ver http://msdn.microsoft.com/en-us/library/system.appdomain.unload.aspx

Incluso para el código administrado solamente, un AppDomain no proporciona una solución de recinto de seguridad robusta. P.ej. si el código cargado genera hilos, estos eliminarán todo el proceso en caso de excepciones no controladas. Esta pregunta tiene un poco más de información: .NET - What's the best way to implement a "catch all exceptions handler".

Por lo que yo sé, la mejor opción para alojar código de esa manera en una aplicación .NET es implementar su propio proceso de host CLR como IIS y SQL Server.

+0

+1. mucho mejor que mi intento. :) –

0

Un AppDomain (dominio de la aplicación), es un entorno aislado donde se ejecutan las aplicaciones.

ayudan a proporcionar aislamiento, descarga, y los límites de seguridad para la ejecución de código administrado .

  • Utilice los dominios de la aplicación para aislar las tareas que pueden llevar a un proceso. Si el estado del dominio de aplicación que es ejecutando una tarea se vuelve inestable, el dominio de aplicación se puede descargar sin afectando el proceso. Esto es importante cuando un proceso debe ejecutarse durante periodos largos sin reiniciar. Usted también puede usar dominios de aplicación para aislar tareas que no deben compartir los datos .

  • Si se carga un ensamblaje en el dominio de aplicación predeterminado, no se puede descargar mientras se está ejecutando el proceso . Sin embargo, si abre un segundo dominio de aplicación a cargue y ejecute el ensamblaje, el ensamblaje se descarga cuando se descarga ese dominio de aplicación . Use esta técnica para minimizar el funcionamiento del conjunto de de procesos de larga ejecución que ocasionalmente usan archivos DLL grandes.

dominios de aplicación múltiples se pueden ejecutar en un solo proceso; sin embargo, existe que no es una correlación uno a uno entre los dominios e hilos de la aplicación . varios hilos pueden pertenecer a un solo dominio de aplicación , y mientras que un dado hilo no se limita a un único dominio aplicación, en cualquier momento dado, un hilo ejecuta en un único dominio aplicación.

lo que las preguntas que podrían ser de interés:

no se profesan ser un experto en el área de dominios de aplicación, pero estoy bastante seguro de que un objeto COM con fuga de memoria (es decir, memoria no administrada) no será liberado por usted cargando el AppDomain.Quizás alguien más familiarizado con esto podría comentar.

Como Brian señaló, "... en la versión 2.0 de .NET Framework dominio no está garantizado para descargar, ya que podría no ser posible terminar la ejecución de subprocesos."

+2

¿Qué medidas de acción recomienda a Rohit? –

+0

@ spoon16: puede agregar su propia respuesta. ;) –

+0

Tengo curiosidad por ver cuál es la respuesta también. No tengo uno para ofrecer en este momento. –

Cuestiones relacionadas