2011-12-27 9 views
6

He creado un pequeño ejemplo donde cargué un ensamblado en un nuevo dominio de aplicación sin ningún permiso. Esto funciona bien, el ensamblaje no puede acceder al sistema de archivos y no puede escuchar los enchufes.Impedir la creación de subprocesos en AppDomain

Pero hay otra cosa que quiero evitar: Creación de subprocesos. ¿Por qué? Causa teóricamente que este conjunto puede crear un hilo que crea aún más hilos e inunde mi memoria.

Pensé en la (en mi opinión) mejor manera: Limitar la memoria de un Dominio de aplicación. es posible? Y si no, ¿qué puedo hacer para evitar la creación de subprocesos?

utilizado este código para crear el hilo

Thread t = new Thread(this.DoWork); 
t.Start(); 

Y este código para el dominio de aplicación

PermissionSet set = new PermissionSet(PermissionState.None); 
set.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution)); 
set.AddPermission(new FileIOPermission(FileIOPermissionAccess.Read | 
             FileIOPermissionAccess.PathDiscovery, 
             this.path)); 

AppDomainSetup info = new AppDomainSetup { ApplicationBase = this.path }; 

this.domain = AppDomain.CreateDomain("Sandbox", null, info, set, null); 

(Ok, me dio el acceso al sistema de archivos en la carpeta donde desea cargar el montaje, esto es sólo porque StrongName fullTrustAssembly = typeof(SecureInstance).Assembly.Evidence.GetHostEvidence<StrongName>(); no funcionan para mí tampoco

esperanza s/o puede ayudar. (:.

+1

No hay forma de que pueda hacer esto AFAIK :) Lo único que puede hacer es establecer el límite de subprocesos en un grupo de subprocesos – Elastep

+1

AFAIK cada AppDomain necesita crear al menos un subproceso; de lo contrario, no se puede ejecutar ... así que deshabilitar la creación de subprocesos significaría que no se puede ejecutar en absoluto en mi humilde opinión. Qué estás intentando lograr ? – Yahia

+0

@Elastep Gracias por su respuesta, pero ¿esto es seguro? Creo que es posible extender el límite de hilo en cualquier pieza de software. Todo esto le da a Java una gran ventaja. En Java, se le pide al SecurityManager antes de la creación del hilo. –

Respuesta

2

Parece que no hay una respuesta fácil para esto. Lo que puede hacer es usar la API de perfiles .NET para tratar de controlar el uso de la memoria en su AppDomain. Puede encontrar más información al respecto aquí, pero deberá realizar algunas excavaciones: http://msdn.microsoft.com/en-us/library/bb384493.aspx

De todos modos, ¿no es mejor ejecutar lo que desee ejecutar en un proceso separado con una prioridad menor, por lo tanto, si se vuelve loco con las asignaciones de memoria, no afecta su proceso, el sistema operativo lo mata y no afecta su proceso principal?

+0

¡Genial, gracias, lo probaré! –

+0

El problema con el aislamiento de nivel de proceso es la sobrecarga de procesos múltiples. Como los hilos no pueden ser abortados de forma segura por un AppDomain de alojamiento, debo asegurarme de que no se puedan crear. Si esto no se puede hacer, entonces quizás deba monitorear las "violaciones" y matar todo el proceso. Más fácil pero peor para el rendimiento es pesimista matar el proceso cada vez. Pero eso lastima el desempeño de todos los que se comportan. –

Cuestiones relacionadas