2011-08-08 6 views
5

Tengo un dominio de aplicación hijo donde quiero cargar algunas bibliotecas dll al iniciar y liberar archivos para que cualquiera pueda eliminarlas.Cargar el ensamblado en AppDomain hijo y liberar el archivo dll

En la puesta en marcha hago

Loader al = (Loader)domain.CreateInstanceAndUnwrap(
typeof(Loader).Assembly.FullName, 
typeof(Loader).FullName); 
al.Load(path) 

para la siguiente clase.

class Loader : MarshalByRefObject 
{ 
    internal void Load(string path) 
    { 
     Assembly assembly; 
     try 
     { 
      assembly = Assembly.Load(File.ReadAllBytes(path)); 
     } 
     catch (Exception) { return; } 
    } 
    internal UseType(string fullyQualifiedTypeName) 
    { 
     Type userType = Type.GetType(fullyQualifiedTypeName); 
    } 
} 

Más tarde me invocan UseType y consigo el tipo correcto pero no soy capaz de eliminar el archivo más, porque es como si la aplicación de dominio de niño ha bloqueado el archivo DLL.

Básicamente lo que quiero lograr es almacenar en caché el archivo de ensamblaje en el arranque y luego usar las llamadas GetType para que se libere el archivo dll real.

¿Es realmente posible lograr algo como esto?

+0

CreateInstanceAndUnwrap() también carga el tipo en el dominio primario de la aplicación. Que bloquea el archivo. Use un tipo de interfaz, definido en un ensamble separado. –

+0

Está bien que tenga el archivo que contiene Loader bloqueado. ¿O cualquier tipo utilizado en los métodos de Loader hará que su ensamblaje se cargue en el dominio principal de la aplicación? – Egor

+0

Vea también: http://stackoverflow.com/questions/6480140/appdomain-shadow-copying-not-working-original-assemblies-locked – cdiggins

Respuesta

5

Use la copia oculta al crear el Dominio de aplicación. Eso copia los dlls en un caché y cualquiera puede interactuar con el sistema de archivos.

Topshelf hace esto con nuestras estanterías (todo vive en su propio dominio de aplicaciones) - https://github.com/Topshelf/Topshelf/blob/v2.3/src/Topshelf/Model/ShelfReference.cs#L126.

Actualización: Topshelf ya no hace esto, pero actualizó un enlace a una versión que sí lo hizo.

+0

¡Gracias por su respuesta! – Egor

+0

No hay problema, espero que haya sido útil. – Travis

+0

Sí, ayudó! Solo se requiere establecer la propiedad ShadowCopyDirectories, si las bibliotecas son de origen personalizado. – Egor

Cuestiones relacionadas