Décharger une Dll

M5i9k Messages postés 49 Date d'inscription mardi 22 novembre 2005 Statut Membre Dernière intervention 10 novembre 2007 - 27 mai 2007 à 16:22
M5i9k Messages postés 49 Date d'inscription mardi 22 novembre 2005 Statut Membre Dernière intervention 10 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???

merci de vos réponse

7 réponses

cs_coq Messages postés 6351 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 100
27 mai 2007 à 16:35
Salut,


Non, il n'est vraiment pas possible de décharger un assembly du domaine d'application courant.

/*
coq
MVP Visual C#
CoqBlog
*/
0
cs_coq Messages postés 6351 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 100
27 mai 2007 à 16:55
Et un peu de lecture, si tu veux approfondir le sujet :-) : Jason Zander's WebLog : Why isn't there an Assembly.Unload method?

/*
coq
MVP Visual C#
CoqBlog
*/
0
M5i9k Messages postés 49 Date d'inscription mardi 22 novembre 2005 Statut Membre Dernière intervention 10 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.
0
M5i9k Messages postés 49 Date d'inscription mardi 22 novembre 2005 Statut Membre Dernière intervention 10 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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_coq Messages postés 6351 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 100
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

/*
coq
MVP Visual C#
CoqBlog
*/
0
cs_coq Messages postés 6351 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 100
3 juin 2007 à 00:01
"Tu peux passer pour un"
Je voulais bien entendu dire
"Tu peux passer par un"

/*
coq
MVP Visual C#
CoqBlog
*/
0
M5i9k Messages postés 49 Date d'inscription mardi 22 novembre 2005 Statut Membre Dernière intervention 10 novembre 2007
4 juin 2007 à 21:54
Je te remercie pour tes réponses et ta source coq je regarde cela.
0