2011-08-08 5 views
5

J'ai un domaine d'application enfant où je veux charger des bibliothèques de dll sur les fichiers de démarrage et de publication afin que tout le monde puisse les supprimer.Charger l'assemblage dans l'enfant AppDomain et libérer le fichier dll

Au démarrage je fais

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

pour la classe suivante.

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); 
    } 
} 

Plus tard, j'invoquez UseType et je reçois le bon type, mais je ne suis pas en mesure de supprimer le fichier plus parce qu'il est comme si l'enfant app-domaine a verrouillé le dll.

Fondamentalement, ce que je veux atteindre est de mettre en cache le fichier d'assemblage au démarrage et d'utiliser par la suite les appels GetType pour que le fichier dll réel soit libéré.

Est-il vraiment possible de réaliser quelque chose comme ça?

+0

CreateInstanceAndUnwrap() récupère également le type chargé dans le domaine principal. Qui verrouille le fichier. Utilisez un type d'interface, défini dans un assembly séparé. –

+0

Il est bon pour moi d'avoir un fichier contenant Loader à verrouiller. Ou tout type utilisé dans les méthodes de Loader rendra son assembly à charger dans le domaine de l'application parente? – Egor

+0

Voir aussi: http://stackoverflow.com/questions/6480140/appdomain-shadow-copying-not-working-original-assemblies-locked – cdiggins

Répondre

5

Utilisez le cliché instantané lorsque vous créez le domaine d'application. Cela copie les DLL dans un cache et n'importe qui peut interagir avec le système de fichiers. Topshelf fait cela avec nos étagères (tout vit dans son propre domaine d'application) - https://github.com/Topshelf/Topshelf/blob/v2.3/src/Topshelf/Model/ShelfReference.cs#L126.

Mise à jour: Topshelf ne le fait plus, mais a mis à jour un lien vers une version qui l'a fait.

+0

Merci pour votre réponse! – Egor

+0

Pas de problème, j'espère que ça a aidé! – Travis

+0

Oui, ça m'a aidé! Seule la propriété ShadowCopyDirectories requise doit être définie, si les bibliothèques proviennent d'une source personnalisée. – Egor

Questions connexes