Pregunta

¿Hay una manera de liberar un objeto que se accede mediante finales de unión (es decir, creado por el método Activator.CreateInstance())?

Tengo una aplicación que transforma los archivos de un formato a otro. Las asambleas que realizan estas traducciones viven en una carpeta en mi directorio de la aplicación.

Cuando se inicia la aplicación por primera vez, que puede eliminar estos montajes de la carpeta de traducción sin ningún error. Sin embargo, una vez que procesar un documento a través de la aplicación (y se han unido a uno de los conjuntos de traslación utilizando enlace tardío), ya no puedo eliminar los conjuntos de traslación. En este punto, estoy recibiendo un mensaje de error que indica que el archivo está "en uso por otra aplicación".

¿Hay una manera de "liberación" del objeto de finales del salto en mi solicitud una vez que haya terminado de usarlo?

¿Fue útil?

Solución

Una vez que una asamblea se carga en un dominio de aplicación que va a permanecer hasta que el dominio aplicación se cierra.

Para evitar esto carga el conjunto en su propio dominio de aplicación, por ejemplo:

AppDomain app = AppDomain.CreateDomain("PlugInDomain");
ObjectHandle objectHandle = app.CreateInstanceFrom(assemblyPath, 
             "MyNamespace.MyComponent");
MyComponent component = (MyComponent) objectHandle.Unwrap();

// do stuff

// Now kill app domain, assembly can be overwritten after this.
AppDomain.Unload(app);

Otros consejos

Una vez que un conjunto se carga en el dominio de aplicación de ejecución, no puede ser descargada (independientemente de si se está creando a través de la reflexión con Activator.CreateInstance).

Lo que se recomienda aquí es implementar un dominio de aplicación secundaria con un tiempo de vida que pueden descargar cuando se quiere disponer de las asambleas.

Hay un montón de ejemplos, pero aquí es una: http://www.dotnet247.com/247reference/msgs/28/142174.aspx .

Desde la gestión de la vida útil de los dominios de aplicación secundaria puede ser un dolor, como alternativa, si está utilizando ASP .NET y está buscando para cargar muchos montajes dinámicos, se puede comprobar cuando su dominio de aplicación actual se satura con los conjuntos de carga dinámica mediante la unión al evento AppDomain.CurrentDomain.AssemblyLoaded y llevar la cuenta, a continuación, solicita el entorno de alojamiento reciclar el dominio de aplicación actual cuando se realiza un número crítico (digamos 500) como:

HostingEnvironment.InitiateShutdown();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top