Ensamblados recopilables para la generación dinámica de tipos
Los ensamblados recopilables son ensamblados dinámicos que se pueden descargar sin descargar el dominio de aplicación en el que se crearon. Se puede recuperar toda la memoria administrada y no administrada usada por un ensamblado recopilable y los tipos que contiene. Información como el nombre del ensamblado se quita de las tablas internas.
Para habilitar la descarga, use la marca AssemblyBuilderAccess.RunAndCollect al crear un ensamblado dinámico. El ensamblado es transitorio (es decir, no se puede guardar) y está sujeto a las limitaciones descritas en la sección Restricciones de los ensamblados recopilables. Common Language Runtime (CLR) descarga automáticamente un ensamblado recopilable cuando ha liberado todos los objetos asociados al ensamblado. En todos los demás aspectos, los ensamblados recopilables se crean y usan de la misma manera que otros ensamblados dinámicos.
Duración de los ensamblados recopilables
La duración de un ensamblado dinámico recopilable está controlada por la existencia de referencias a los tipos que contiene y los objetos que se crean a partir de esos tipos. Common Language Runtime no descarga un ensamblado si existe uno o más de los siguientes elementos (T es cualquier tipo definido en el ensamblado):
Una instancia de T.
Una instancia de una matriz de T o una instancia de una colección genérica que tenga T como uno de sus argumentos de tipo, incluso aunque esa matriz o la colección esté vacía.
Una instancia de Type o TypeBuilder que represente T.
Nota |
---|
Debe liberar todos los objetos que representan partes del ensamblado.La clase ModuleBuilder que definía T conserva una referencia a TypeBuilder y el objeto AssemblyBuilder conserva una referencia a ModuleBuilder, por lo que se deben liberar las referencias a estos objetos.Incluso la existencia de una clase LocalBuilder o ILGenerator usada en la construcción de T impide la descarga. |
Una referencia estática a T por otro tipo T1 definido dinámicamente que todavía es alcanzable ejecutando código. Por ejemplo, T1 podrían derivar de T o T podría ser el tipo de un parámetro en un método de T1.
Un parámetro ByRef para un campo estático que pertenece a T.
Una estructura RuntimeTypeHandle, RuntimeFieldHandle o RuntimeMethodHandle que hace referencia a T o a un componente de T.
Una instancia de cualquier objeto de reflexión que se pueda usar indirecta o directamente para obtener acceso al objeto Type que representa T. Por ejemplo, el objeto Type para T se puede obtener de un tipo de matriz cuyo tipo de elemento sea T o de un tipo genérico que tenga T como argumento de tipo.
Un método M de la pila de llamadas de cualquier subproceso, donde M es un método de T o un método de nivel de módulo que se define en el ensamblado.
Un delegado de un método estático que se define en un módulo del ensamblado.
Si solo existe un elemento de esta lista para un único tipo o método en el ensamblado, el runtime no puede descargar el ensamblado.
Nota |
---|
El runtime no descarga realmente el ensamblado hasta que no se hayan ejecutado finalizadores para todos los elementos de la lista. |
Para realizar el seguimiento de la duración, se considera que un tipo genérico construido como List<int> (List(Of Integer) en Visual Basic) que se crea y se usa en la generación de un ensamblado recopilable se ha definido en el ensamblado que contiene la definición de tipo genérico o en un ensamblado que contiene la definición de uno de sus argumentos de tipo. El ensamblado exacto que se usa es un detalle de implementación y está sujeto a cambios.
Restricciones de los ensamblados recopilables
Se aplican las restricciones siguientes a los ensamblados recopilables:
Referencias estáticas Los tipos de un ensamblado dinámico normal no pueden tener referencias estáticas a tipos que se definen en un ensamblado recopilable. Por ejemplo, si define un tipo normal que hereda un tipo de un ensamblado recopilable, se produce una excepción NotSupportedException. Un tipo de un ensamblado recopilable puede tener referencias estáticas a un tipo de otro ensamblado recopilable, pero esto extiende la duración del ensamblado al que se hace referencia a la duración del ensamblado de referencia.
Interoperabilidad COM No se pueden definir interfaces COM dentro de un ensamblado recopilable y ninguna instancia de tipos dentro de un ensamblado recopilable se puede convertir en objetos COM. Un tipo de un ensamblado recopilable no puede actuar como un contenedor CCW (COM callable wrapper) ni como un contenedor RCW (Runtime Callable Wrapper). Sin embargo, los tipos de ensamblados recopilables pueden usar objetos que implementan interfaces COM.
Invocación de plataforma Los métodos que tienen el atributo DllImportAttribute no se compilarán cuando se declaren dentro de un ensamblado recopilable. La instrucción OpCodes.Calli no se puede usar en la implementación de un tipo en un ensamblado recopilable y no se pueden calcular referencias de esos tipos a código no administrado. Sin embargo, puede llamar a código nativo usando un punto de entrada que se declara en un ensamblado no recopilable.
Cálculo de referencias No se pueden calcular referencias a objetos que se definen en ensamblados recopilables (en particular, delegados). Se trata de una restricción de todos los tipos transitorios emitidos.
Carga de ensamblados La emisión de reflexión es el único mecanismo permitido para cargar ensamblados recopilables. Los ensamblados que se cargan mediante cualquiera otra forma de carga de ensamblados no se pueden descargar.
Objetos enlazados a un contexto No se admiten variables de contexto estático. Los tipos de un ensamblado recopilable no pueden extender ContextBoundObject. Sin embargo, el código de ensamblados recopilables puede usar objetos enlazados a un contexto que se definen en otra parte.
Datos de subproceso estático No se admiten variables de subproceso estático.