Bonjour,
je réalise une applicaiton dans laquelle je souhaite implémenter un systeme de plugins.
J'ai donc un .exe central et dans un répertoire "plugins", des dll qui sont les plugins
Au démarrage de l'appli, je parcours le répertoire plugins, a chaque fois que je rencontre une dll, je la charge en tant qu'assembly, je verifie via la réflexion si l'assembly contient un type implémentant une interface et si c'est le cas, j'instancie ce type pour l'ajouter dans mon appli.
Tout ca marche très bien
2 ème étape, je souhaite ajouter un gestionnaire de plugin dans mon appli: le gestionnaire pourrait ajouter ou supprimer des plugins.
Concernant la suppression de plugins, je veux supprimer les dll correspondante. Cependant, pour les supprimer, je dois déréférencer l'assembly de mon appli. Par contre, on ne peut pas déréférencer comme ca, on est obligé de décharger l'appdomain correspondant
Il faudrait donc que je puisse créer pour chaque plugin (dll, assembly) un appdomain correspondant.
Et c'est la ou je bloque, je n'arrive pas à créer un appdomain par plugin....
Si vous avez des idées, je commence vraiment à bloquer la :(
Rollerman
_________________________________________________________________________________________________
'*****************************************************************************************************'fonction scannant un répertoire et retournant un arraylist avec la liste des plugins trouvésPublicSub load_plugins(ByVal e_plugins_directory AsString)'init les arraylistsingleton.t_plugins =
New ArrayList'parcours le dossier plugins pour charger les pluginsDim chemin AsString = e_plugins_directoryDim d AsString'pour chaque répertoire dans le répertoire pluginForEach d In IO.Directory.GetDirectories(chemin)'cree un domain pour le repertoireDim setup_test AsNew AppDomainSetupDim domain_name AsString = "domain_" & d.Substring(d.LastIndexOf("\") + 1)setup_test.ApplicationBase = d
setup_test.PrivateBinPath = d
current_domain = AppDomain.CreateDomain(domain_name,
Nothing, setup_test)'parse les dll du dossiercurrent_directory_plugin = d
current_domain.DoCallBack(
AddressOf scan_plugin_folder)NextEndSub
PublicSub scan_plugin_folder()'parse les fichiersDim f AsStringForEach f In IO.Directory.GetFiles(current_directory_plugin)'si c une dllIf f.EndsWith(".dll") Then'on charge la dll par réflexionDim monAssembly As [Assembly]TrymonAssembly = System.Reflection.Assembly.LoadFrom(f)
'parcourt les type de l'assemblyDim MonType As TypeForEach MonType In monAssembly.GetTypes()'pour chaque type, on regarde si il hérite de uc_multimediaIf MonType.BaseType.Name = "uc_multimedia" Then'instancie & ajoute au tableausingleton.t_plugins.Add(current_domain.CreateInstanceFrom(monAssembly.FullName, MonType.Name))
EndIfNextCatch ex As Exception'rien, c'est que ce n'est pas une assembly valideEndTryEndIfNextEndSub