Est-il possible de conserver une référence à un assemblage d'un autre domaine sans que cet assemblage ne soit chargé dans le domaine actuel?Assemblage de l'assemblage à partir d'un autre AppDomain
Je travaille sur la réparation d'une fuite de mémoire dans un service Windows qui génère dynamiquement des assemblys et exécute le code généré dynamiquement. Le problème est que les assemblys générés sont chargés dans le domaine de l'application actuelle et ne peuvent jamais être déchargés.
Il y a une méthode dans l'une des bibliothèques de services Windows qui a la signature suivante:
public Assembly CreateMethod(ObservableCollection<Field> sourceFields, Field destinationField)
Cette méthode crée le code pour l'assemblage et la charge avec la fonction LoadMethod bibliothèque CSScript:
result = CSScript.LoadMethod(scriptFunction.ToString());
Plus tard, la référence d'assemblage de CreateMethod est utilisée pour exécuter une fonction dans l'assembly généré.
public object Run(Field destinationField, ObservableCollection<LinkField> sourceLinkFields, DataRow mainRow, Assembly script) {
...
var method = script.GetStaticMethodWithArgs("*.a" + Id.ToString().Replace("-", String.Empty), argumentTypes.ToArray());
return method(arguments.ToArray());
}
Je me demande s'il est possible de charger l'assembly généré dynamiquement dans un autre domaine d'application et de les exécuter par un certain type de procuration sans l'avoir chargé dans le domaine de l'application actuelle.
Edit:
Je veux savoir si je peux utiliser une référence de classe Assembly
dans un AppDomain lorsque l'ensemble est chargé dans un autre AppDomain. En regardant la documentation MSDN, ils montrent comment utiliser MarshalByRefObject. Fondamentalement, j'essaie d'éviter de changer la signature de ma fonction CreateMethod, mais il se peut que je devrais la changer pour retourner MarshalByRefObject si ce n'est pas possible.
Mise à jour:
J'ai fini par mettre l'appel à CSScript.LoadMethod dans l'autre application domaine où je garde un dictionnaire, je puis fait CreateMethod retourner un Guid au lieu d'une Assemblée, puis je passe cette Guid autour jusqu'à l'appel Run. L'appel Exécuter prend maintenant un Guid comme argument au lieu d'un assemblage. Dans l'appel Run, je passe le Guid à l'autre domaine de l'application, exécute la méthode et renvoie l'objet result via une classe qui hérite de MarshalByRefObject.
Voir par exemple: http: // stackoverflow.com/questions/88717/chargement-dlls-dans-un-domaine-distinct – DeCaf