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?
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é. –
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
Voir aussi: http://stackoverflow.com/questions/6480140/appdomain-shadow-copying-not-working-original-assemblies-locked – cdiggins