M5i9k
Messages postés49Date d'inscriptionmardi 22 novembre 2005StatutMembreDernière intervention10 novembre 2007
-
27 mai 2007 à 16:22
M5i9k
Messages postés49Date d'inscriptionmardi 22 novembre 2005StatutMembreDernière intervention10 novembre 2007
-
4 juin 2007 à 21:54
Bonjour à tous,
je voudrais creer une application qui puisse charger un assembly et le décharger pour permettre de le mettre à jour puis de le recharger.
J'ai essayé de la manière suivante :
Assembly a = Assembly.LoadFrom("test.dll");
Type t = a.GetType("ActionsDll.Actions");
object target = Activator.CreateInstance(t);
string ret = (string)t.InvokeMember("Execute",BindingFlags.InvokeMethod,null, target, new object[]{"msgBox"});
pour charger un assembly comntenu dans test.dll qui contient une fonction Execute. Pendant l'execution du programme, je ne peux plus supprimer la dll. Je voudrais donc la décharger mais je ne trouve pas comment faire sauf en utilisant AppDomain mais je trouve cela trop compliqué pour ce que je veux faire :
AppDomain n = AppDomain.CreateDomain("test");
object target = n.CreateInstanceAndUnwrap("test.dll","ActionsDll.Actions");
...
N'y à t'il pas moyen de décharger un assembly qui à été charger dans l'AppDomain courant???
M5i9k
Messages postés49Date d'inscriptionmardi 22 novembre 2005StatutMembreDernière intervention10 novembre 2007 27 mai 2007 à 17:26
Ok je te remercie pour la réponse et le lien, je dois donc utiliser un AppDomain mais je n'arrive pas à suivre les étapes, peux tu me donner un bout de code que je puisse reprendre?
1) Je créé un AppDomain :
AppDomain a = AppDomain.CreateDomain("test");
2) Je charge l'assembly dans ce nouveau AppDomain (test.dll)
3) J'appelle la fonction Execute de l'assembly (string ActionsDll.Execute(string))
4) Je décharge l'assembly
Peux tu me montrer comment faire le plus simple possible car dans les exemples que j'ai vus, il faut creer une classe qui contient un arrayList d'assembly et je ne comprends pas le fonctionnement, je n'ai besoin que d'un assembly.
Merci d"avance.
M5i9k
Messages postés49Date d'inscriptionmardi 22 novembre 2005StatutMembreDernière intervention10 novembre 2007 27 mai 2007 à 22:09
Voici le code que j'essaye de faire fonctionner mais qui ne fonctionne pas :
AppDomain n = AppDomain.CreateDomain("test");
Assembly a = n.Load("ActionsDll");
Type t = a.GetType("ActionsDll.Actions");
object target = n.CreateInstance("ActionsDll","ActionsDll.Actions");
j'ai renommé test.dll en ActionsDll.dll qui est son nom à la compilation.
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_coq
Messages postés6350Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 3 juin 2007 à 00:00
Salut,
Comme le dit la doc, le problème est que, la classe Assembly n'héritant pas de MarshalByRefObject, la méthode AppDomain.Load ne doit pas être utilisée pour charger un assembly dans un autre domaine d'application que celui courant.
Tu peux passer pour un "loader" similaire à ce que j'ai fait dans cette source là par exemple : http://www.csharpfr.com/codes/PORTEE-VALEUR-CHAMP-STATIC_41444.aspx