Compartir a través de


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 reclamar toda la memoria administrada y sin administrar usada por un ensamblado recopilable y los tipos que contiene. La información como el nombre de ensamblado se quita de las tablas internas.

Para habilitar la descarga, use la AssemblyBuilderAccess.RunAndCollect marca al crear un ensamblado dinámico. El ensamblado es transitorio (es decir, no se puede guardar) y está sujeto a limitaciones descritas en la sección Restricciones de ensamblados recopilables . Common Language Runtime (CLR) descarga automáticamente un ensamblado recopilable al liberar 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 conjunto coleccionable se controla mediante la existencia de referencias a los tipos que contiene y los objetos creados a partir de esos tipos. Common Language Runtime no descarga un ensamblado siempre que exista uno o varios de los siguientes (T es cualquier tipo definido en el ensamblado):

  • Instancia de T.

  • Instancia de una matriz de T.

  • Instancia de un tipo genérico que tiene T como uno de sus argumentos de tipo. Esto incluye colecciones genéricas de T, incluso si esa colección está vacía.

  • Instancia de Type o TypeBuilder que representa T.

    Importante

    Debe liberar todos los objetos que representan partes del ensamblado. El ModuleBuilder que define T mantiene una referencia a TypeBuilder, y el objeto AssemblyBuilder mantiene una referencia a ModuleBuilder, por lo que se deben liberar las referencias a estos objetos. Incluso la existencia de un elemento LocalBuilder o ILGenerator usado en la construcción de T evita la descarga.

  • Referencia estática a T mediante otro tipo T1 definido dinámicamente que sigue siendo accesible mediante la ejecución del código. Por ejemplo, T1 puede derivar de To T podría ser el tipo de un parámetro en un método de T1.

  • Asignar un ByRef a un campo estático que pertenece a T.

  • Un RuntimeTypeHandle, RuntimeFieldHandleo RuntimeMethodHandle que hace referencia a T o a un componente de T.

  • Una instancia de cualquier objeto de reflexión que pueda usarse directa o indirectamente para acceder al objeto Type que representa T. Por ejemplo, el Type objeto para T se puede obtener de un tipo de matriz cuyo tipo de elemento es T, o de un tipo genérico que tiene T como argumento de tipo.

  • Un método M en la pila de llamadas de cualquier subproceso, donde M es un método de T o un método a nivel de módulo que se define en el ensamblado.

  • Delegado de un método estático que está definido en un módulo del ensamblado.

Si solo existe un elemento de esta lista para un solo tipo o un método en el ensamblado, el tiempo de ejecución no puede descargar el ensamblado.

Nota:

El runtime no descarga realmente el ensamblado hasta que se han ejecutado los finalizadores de todos los elementos de la lista.

Para fines de seguimiento de la duración, un tipo genérico construido como List<int> (en C#) o List(Of Integer) (en Visual Basic) que se utiliza en la generación de un ensamblado recopilable se considera definido ya sea en el ensamblado que contiene la definición del 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

Las restricciones siguientes se aplican a los ensamblados recopilables:

  • Referencias estáticas

    Los tipos de un ensamblado dinámico normal no pueden tener referencias estáticas a tipos definidos en un ensamblado recopilable. Por ejemplo, si define un tipo normal que hereda de 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 en otro ensamblado recopilable, pero esto extiende la duración del ensamblado al que se hace referencia hasta la vigencia del ensamblado que hace referencia.

Las restricciones siguientes se aplican a los ensamblados recopilables en .NET Framework:

  • Interoperabilidad COM

    No se puede definir ninguna interfaz COM dentro de un ensamblado recopilable y no se puede convertir ninguna instancia de tipos dentro de un ensamblado recopilable en objetos COM. Un tipo de un ensamblado recopilable no puede actuar como contenedor CCW ni contenedor RCW. Pero los tipos de los ensamblados recopilables pueden usar objetos que implementen interfaces COM.

  • Invocación de plataforma

    Los métodos que tienen el DllImportAttribute atributo no se compilarán cuando se declaren en un ensamblado recopilable. La instrucción OpCodes.Calli no se puede usar en la implementación de un tipo de un ensamblado recopilable y estos tipos no se pueden serializar en código no administrado. Pero se puede llamar al código nativo mediante el uso de un punto de entrada declarado en un ensamblado no recopilable.

  • Serialización

    No se pueden serializar los objetos (en particular, delegados) definidos en ensamblados recopilables. Se trata de una restricción sobre todos los tipos de emisión transitoria.

  • Carga de ensamblados

    La emisión de la reflexión es el único mecanismo admitido para cargar ensamblados recopilables. Los ensamblados cargados mediante cualquier otra forma de carga de ensamblados no se pueden descargar.

  • Objetos enlazados a contexto

    No se admiten variables estáticas de contexto. Los tipos de un ensamblado recopilable no pueden extender ContextBoundObject. Pero el código de los ensamblados recopilables puede usar objetos enlazados a un contexto definidos en otro lugar.

  • Datos estáticos de hilo

    No se admiten las variables Thread-static.

Las restricciones siguientes se aplican a los ensamblados recopilables en .NET Framework y versiones de .NET anteriores a .NET 9:

  • Campos estáticos con FixedAddressValueTypeAttribute

    Los campos estáticos definidos en ensamblados recopilables no pueden tener aplicado el FixedAddressValueTypeAttribute atributo .

Consulte también